c - 使用 strtok() 将字符串分成 3 部分

标签 c string segmentation-fault strtok

以下代码行给我一个段错误。寄存器是:fgets 之后的 inputPtr = 00 PRNT 02(来自标准输入的正确输入),第一个 strtok() 之后的 inputPtr = 00,第二个 strtok() 之后的 inputPtr = (null)

if/else 返回 3;是错误检查。

据我所知,问题是对 strtok() 的第二次调用没有读取 PRNT,所以我明白了为什么会发生段错误。我真的很想能够阅读 PRNT。 一点帮助就太好了!谢谢!

  fgets(input, 15, stdin);
    /*Tokenize instr00 into "00"(instructionCounter) "INST"(operationCode) and "OP"(operand)*/
    if(atoi(strtok(inputPtr, " ")) >= 0 && atoi(strtok(inputPtr, " ")) <= 99)
    {
        *instructionCounter = atoi(strtok(inputPtr, " "));
    }
    else
    {
        return 3;
    }
    inputPtr = strtok(NULL, " ");

最佳答案

让我们做以下测试。

fgets(inputPtr, 15, stdin);

现在 inputPtr 有值 "00 PRNT 02" 现在使用 strtok 获取 "00"

char *p = strtok(inputStr," ");

现在 printf("%s",p) 输出 "00"

Does strtok allocates new memory for "00" and returns address to p? Answer is NO. It only returns pointer to the first character and shift its internal pointer to beginning of next token. So next time when strtok(NULL," ") is called, it begins from that internal pointer.

所以p指向inputPtr的第一个字符。但是 printf 打印字符串直到它遇到空字符 '\0'。所以 "00" 后面跟着 p 中的空字符。但是由于 p 指向 inputStr,所以 inputStr 也会发生同样的情况。

因此情况是,在第一个 strtok 之后,系统将 “00” 之后的初始 ""(空格)替换为空字符。

您可以使用以下命令序列进行检查。

char *p = strtok(inputStr," ");
printf("%s",p); //output is "00"
printf("%s",inputStr); // output is "00" 

因此,当您第二次执行 p = strtok(inputStr,""); 时,您只是标记字符串 "00",而不是 "00 PRNT 02",因此您不会打印 PRNT。不要再调用它。改进后的代码如下。

fgets(inputPtr, 15, stdin);

int a = atoi(strtok(inputPtr, " "));
if(a >= 0 && a <= 99)
{
     *instructionCounter = a;
}
else
{
    return 3;
}
inputPtr = strtok(NULL, " ");

关于c - 使用 strtok() 将字符串分成 3 部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22189166/

相关文章:

c - 返回类型为 void 的函数

c# - C#中如何从字符串中提取字符串

c++ - 具有继承的C++中的段错误

c - 从 *char 解析 int 的快速简便方法

c - 程序查找图的两个给定顶点之间是否存在路径

c - strtok 的段错误

python c api无法将任何模块导入新创建的模块

c - 如何创建静态常量数组的数组

c - 选择C程序中的目录以在其中运行

c++ - C++ 中的 const char*