我必须获取字符串中的第三个单词,并想使用 strtok 。现在,第一个 printf 可以运行,但是之后出现了Seg Fault。所以tokenizedString = strtok(NULL, " ");
一定是造成问题的原因,对吧?
仅出于上下文考虑:我正在寻找字符串中的第三个单词,并且单词之间可以有尽可能多的空格。
#include <string.h>
#include <stdio.h>
char *tokenizeString(char *userCommand)
{
char *tokenizedString;
int counterForToken;
tokenizedString = strtok(userCommand, " ");
for(counterForToken = 0; counterForToken != 3; counterForToken++)
{
printf("%s\n", tokenizedString);
tokenizedString = strtok(NULL, " ");
if(tokenizedString == NULL)
{
break;
}
}
printf("%s\n", tokenizedString);
return tokenizedString;
}
int main(void)
{
char userCommand[255] = {0};
fgets(userCommand, sizeof(userCommand), stdin);
tokenizeString(userCommand);
}
答案 0 :(得分:1)
现在,第一个printf可以工作了,但是之后我遇到了Seg Fault。所以
tokenizedString = strtok(NULL, " ");
一定是造成问题的原因,对吧?
不,这是非常差的相关性。实际上,问题出在第二次调用printf
中。您可以在tokenizedString
时将其传递给tokenizedString == NULL
。指定的格式%s
被指定为期望有效的指针指向零终止字符数组的第一个字符。传递NULL
是非法的,并导致不确定的行为(例如,导致崩溃)。解决方法很简单:检查空指针值。当然,循环的第一次迭代也是如此
char *tokenizeString(char *userCommand)
{
char *tokenizedString;
int counterForToken;
tokenizedString = strtok(userCommand, " ");
for(counterForToken = 0; counterForToken != 3 && tokenizedString != NULL; counterForToken++)
{
printf("%s\n", tokenizedString);
tokenizedString = strtok(NULL, " ");
}
if(tokenizedString != NULL)
printf("%s\n", tokenizedString);
return tokenizedString;
}