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