以下代码行给我一个段错误。寄存器是: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/