C程序从未从strtok()函数返回时出现问题

C程序从未从strtok()函数返回时出现问题,c,string,strtok,C,String,Strtok,我正在做一项大学作业,我一直在为一个奇怪的问题绞尽脑汁,我的程序调用了strtok 我的代码如下所示: int loadMenuDataIn(GJCType* menu, char *data) { char *lineTokenPtr; int i; lineTokenPtr = strtok(data, "\n"); while (lineTokenPtr != NULL) { /* ... */ } } 我在网上查了很多网站,但是我看不出我

我正在做一项大学作业,我一直在为一个奇怪的问题绞尽脑汁,我的程序调用了strtok

我的代码如下所示:

int loadMenuDataIn(GJCType* menu, char *data)
{
   char *lineTokenPtr;
   int i;

   lineTokenPtr = strtok(data, "\n"); 
   while (lineTokenPtr != NULL) { 

   /* ... */

   }

}
我在网上查了很多网站,但是我看不出我使用strtok的方式有什么问题,我也无法确定为什么我的代码会被卡在这行
lineTokenPtr=strtok(数据“\n”)

有人能帮我解释一下吗


(使用OSX和Xcode,如果有区别的话)

您检查过参数的内容了吗?是否终止\0

你传递的参数是可写内存吗?strtok将其标记字符串时作为第一个参数写入缓冲区

如果你写信的话

char* mystring = "hello\n";

strtok(mystring,"\n"); // you get problems
函数
strtok()
用null(即
\0
)字符替换字符串中的实际标记分隔符号,并返回指向字符串中标记开头的指针。因此,在使用换行符反复调用strtok()
之后,字符串缓冲区

"The fox\nran over\nthe hill\n"
内存中的内容将被逐字地修改到位并转化为

"The fox\0ran over\0the hill\0"

使用从
strtok()
返回的
char
指针,这些指针指向字符串
fox\0
跑过\0
,和
山丘\0
。没有分配新内存。。。原始字符串内存被修改到位,这意味着不要传递类型为
const char*

的字符串文本非常重要。您是否已使用调试器,并验证这是未返回的行?如果是,什么是
数据
?它是否正确终止,而不是Unicode等?如果您想继续使用传递给
strtok
的字符串,必须创建它的副本,因为
strtok
strep
都会修改它。等等,您的意思是它试图更改我原来的输入字符串!?是的。您可以得到一个提示,因为strtok的第一个参数声明为char*not const char*,strtok的签名是
char*strtok(char*str,const char*分隔符)。输入字符串缺少const应该告诉您它可能会被修改。