【问题标题】:strtok(NULL, ) segmentation faulsstrtok(NULL, ) 分段错误
【发布时间】:2023-03-24 06:05:01
【问题描述】:

一段代码的输入是:

initfs /home/bin/usr/a.txt 1000 100

代码如下:

printf("Enter a command\n");
scanf("%99[0-9a-zA-Z ]s", userInput);
printf("%s\n", userInput);
command = strtok(userInput, " ");
filePath = strtok(NULL, " ");

userInput"initfs /home/bin/usr/a.txt 1000 100" 被存储和 在变量command中,存储了"initfs"。 但是如果我打印filePath,就会出现分段错误。 它应该打印"/home/bin/usr/a.txt"

可能是什么问题?

【问题讨论】:

  • 您确定userInput 中的内容吗?我希望它在 "initfs " 之后停止,因为您的 [0-9a-zA-Z ] 不允许斜杠。
  • 看起来 filePathNULL。你有调试器吗?使用一个来解决这个问题很简单。如果你没有调试器,为什么不呢?如果你不知道如何使用一个,为什么不呢?如果您不能插入printf 语句来调试它,为什么不呢?总之,你需要学习一些基本的调试技术。
  • 当我在您描述的输入上运行您的代码时,userInput 的值是“initfs”,而不是“initfs /home/bin/usr/a.txt 1000 100”。您确定scanf 的行为符合您的预期吗?
  • @qwrrty - 是的,userInput 只有 initfs。你能告诉我如何将这种输入标记为 4 个变量吗?
  • 如果您的意思是输入一整行,%99[^\n] 将比列出所有允许的字符容易得多。

标签: c segmentation-fault strtok


【解决方案1】:

一般来说,对于解析来自键盘的输入,我发现它比使用fgets(或getline,如果你愿意)读取整行文本然后从那里解析它要容易得多。例如:

char userInput[1024];
while (fgets(userInput, 1024, stdin) != NULL) {
    handleInput(userInput);
}

...
void handleInput(char *userInput)
{
    char *command, *filePath;
    command = strtok(userInput, " ");
    filePath = strtok(NULL, " ");
    ...
}

直接在用户输入上使用scanf 太挑剔了,很容易对输入数据的微小变化感到困惑。

【讨论】:

    猜你喜欢
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    相关资源
    最近更新 更多