1

我正在完成一项大学作业,我一直在思考一个奇怪的问题,我的程序调用strtok并且永远不会返回。

我的代码如下所示:

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

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

   /* ... */

   }

}

我在网上查了一堆网站,但我看不出我使用的方式有什么问题,strtok我无法确定为什么我的代码会卡在线上lineTokenPtr = strtok(data, "\n");

任何人都可以帮我解释一下吗?

(如果有任何区别,请使用 OSX 和 Xcode)

4

2 回答 2

2

你检查过论证的内容吗?它 \0 终止了吗?

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

IOW 如果你写

char* mystring = "hello\n";

strtok(mystring,"\n"); // you get problems
于 2011-05-03T03:06:49.633 回答
0

该函数strtok()将字符串中的实际标记分隔符号替换为空(即,\0)字符,并返回一个指向字符串中标记开头的指针。因此,在使用换行符分隔符号重复调用之后strtok(),字符串缓冲区看起来像

"The fox\nran over\nthe hill\n"

在内存中将被原地修改并变成

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

charstrtok()该点返回指向字符串the fox\0ran over\0和的指针the hill\0。没有分配新的内存......原始字符串内存被就地修改,这意味着不要传递类型为 的字符串文字很重要const char*

于 2011-05-03T03:31:40.503 回答