2011-05-03 86 views
1

我正在进行大学任务,并且一直在绕着一个奇怪的问题绕着我的脑袋,我的程序调用strtok并永远不会返回。C程序问题永远不会从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中,如果任何区别)

+0

你是否已经加入了调试器,你能否验证那个线路没有返回?如果是这样,什么是'数据'?它是否正确终止,而不是Unicode等? – 2011-05-03 03:07:30

+0

'data'包含什么? – Marlon 2011-05-03 03:12:57

+0

如果您想继续使用传递给'strtok'的字符串,则必须创建它的副本,因为'strtok'和'strsep'都会修改它。 – 2011-05-03 03:52:49

回答

2

你检查参数的内容是什么?它终止了吗?

您传递的论点是可写内存吗?当strtok标记字符串时,strtok向缓冲区写入它作为第一个参数。

督察,如果你写

char* mystring = "hello\n"; 

strtok(mystring,"\n"); // you get problems 
+1

挂上,你的意思是它试图改变我原来的输入字符串!? – Ash 2011-05-03 03:13:04

+0

是的,它的确如此。你可以得到一个提示,因为strtok的第一个参数被声明为char *而不是const char * – 2011-05-03 03:14:49

+0

strtok的签名是'char * strtok(char * str,const char * delimiters);'。输入字符串缺少const会告诉你它可能会被修改。 – Marlon 2011-05-03 03:14:53

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\0the hill\0。没有新的内存被分配......原始的字符串内存被就地修改,这意味着重要的是不要传递类型为const char*的字符串。

相关问题