我正在完成大学任务,我一直在解决一个奇怪的问题,我的程序调用{{1}}并且永远不会返回。
我的代码如下:
strtok
我在网上查了很多网站,但是我看不出我使用int loadMenuDataIn(GJCType* menu, char *data)
{
char *lineTokenPtr;
int i;
lineTokenPtr = strtok(data, "\n");
while (lineTokenPtr != NULL) {
/* ... */
}
}
的方式有什么问题,我无法确定为什么我的代码会被卡在线上{ {1}}
任何人都可以帮我解释一下吗?
(使用OSX和Xcode,如果它有任何区别)
答案 0 :(得分:2)
你检查了参数的内容吗?它终止了吗?
你传递的论点是可写内存吗?当strtok对字符串进行标记时,它会将其作为第一个参数写入缓冲区。
如果你写,
char* mystring = "hello\n";
strtok(mystring,"\n"); // you get problems
答案 1 :(得分:0)
函数strtok()
用空(即\0
)字符替换字符串中的实际标记分隔符号,并返回指向字符串中标记开头的指针。因此,在使用换行符分隔符号重复调用strtok()
后,字符串缓冲区看起来像
"The fox\nran over\nthe hill\n"
内存中的将按字面修改并转换为
"The fox\0ran over\0the hill\0"
从char
返回的strtok()
指针指向字符串the fox\0
,ran over\0
和the hill\0
。没有分配新内存...原始字符串内存被就地修改,这意味着不要传递类型为const char*
的字符串文字。