Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中同时使用getline和strtok?_C - Fatal编程技术网

如何在C中同时使用getline和strtok?

如何在C中同时使用getline和strtok?,c,C,这是我第一次在这里问问题,所以我希望我做得正确!一段时间以来,我一直试图让getline和strtok一起工作,以便从文件中读取文本并将其分解为单词。从本质上讲,文本文件输入是一篇文章,我想稍后单独处理每个单词。我遇到的问题是一个常量“赋值使指针从整数变为无强制转换”;我已经尝试了我能想到的一切。这是我目前的代码: int nbytes = 100; char *buffer; char *token; buffer = (char *) malloc(nbytes + 1); getline(

这是我第一次在这里问问题,所以我希望我做得正确!一段时间以来,我一直试图让getline和strtok一起工作,以便从文件中读取文本并将其分解为单词。从本质上讲,文本文件输入是一篇文章,我想稍后单独处理每个单词。我遇到的问题是一个常量“赋值使指针从整数变为无强制转换”;我已经尝试了我能想到的一切。这是我目前的代码:

int nbytes = 100;
char *buffer;
char *token;
buffer = (char *) malloc(nbytes + 1);
getline(&buffer,&nbytes,file);
token = strtok(&buffer, " ");
我觉得这是一个我忽略的简单问题。感谢你的阅读和帮助

标准C(本身)没有定义任何名为
getline
的东西。要从文件中读取一行,通常使用
fgets


您描述的错误听起来好像没有范围内的
strtok
原型,因此编译器将其视为返回默认类型(int)。您通常会通过在靠近文件顶部的位置添加
#include
来消除这种情况。

我认为您不希望在
strtok()调用中使用
&buffer
。另外,您没有包括
string.h
,这就是为什么您会收到警告“赋值从整数生成指针而不进行强制转换”。如果没有可用的
strtok()
的正确原型,编译器将假定它返回
int
。将
int
转换为
char*
以将赋值转换为
token
就是它抱怨的赋值


编辑-感谢@dmckee对
getline()

的签名,还有一个错误是使用&buffer而不是buffer


&缓冲区是指向字符的指针,但您需要指向字符的指针。

您是对的,我没有。这有助于解决问题;非常感谢。虽然c没有,但2008版的POSIX在
stdio.h
中包含了
getline
(带有GNU语义),尽管并非每个系统都支持这一点。如果你不得不乞求借钱或偷东西,你需要
getline
,因为它会管理
buffer
,以确保它能得到整条线。@dmckee:嗯,不是真的——在POSIX包含
getline
之前很久,一个叫马丁·曼尼的家伙写了一篇他称之为
xgetline
的文章,做了大致相同的事情。看了一眼我的副本,我显然在1994年对它做了一些修改——但长话短说,我早在POSIX之前就已经涵盖了这一点……再加上include,这有助于解决问题。非常感谢你
getline(char**lineptr,size\t*n,FILE*stream)
请注意,如果您有一个足够新的libc来拥有
getline
,那么您可能还拥有
strep
,它是新改进的
strok
。也不要强制转换
malloc
的返回类型。这可能会隐藏完全相同的问题,即不包括声明它的正确头文件。