c - strtok 导致分段错误
问题描述
我必须得到字符串中的第三个单词并想使用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);
}
解决方案
现在,第一个 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;
}
推荐阅读
- c++ - 添加某些 .cpp 文件时出现这么多错误
- python - Pycharm 模块安装:ModuleNotFoundError: No module named 'utilities'
- python - 每个元素的功能映射?
- javascript - 传单 geojson - 指向某些图标上的图层集 z 索引?
- python - Python os.rename,删除和错误捕获
- c# - '无法创建'System.Object'类型的常量值。在此上下文中仅支持原始类型或枚举类型。
- random - 随机的惰性流:评估何时发生?
- android - 重构依赖项后,包 android.support.design.widget 不存在 - Androidx api 28
- windows - 如何通过脚本启用/禁用网络摄像头(Win 10)
- python - 拥抱创建 GET 端点以下载创建的 Word 文档