c-strtok的分段错误



im正在尝试一个简单的程序,该程序将从输入中读取一个字符串、一个大写字母和2个浮点值。

无论我对代码或输入进行了多少调试、更改或检查,我都会在最后一次读取令牌时出现分段错误。

我输入的输入是:CCD_ 1。我希望程序忽略大写字母和值之间的所有空格和逗号。

#include <stdio.h>
#include <string.h>
int main(){
char *value, *string;
char buffer[100];
float x;
if(fgets(buffer, sizeof(buffer), stdin)==NULL)
printf("empty inputn");
string = strtok(buffer, " ");
if(strcmp(string, "text")==0){  
if((value = strtok(NULL, " tn")!=NULL))  /*seg.falt causes here*/
sscanf(value, " %f", &x);              /*or here*/
}
}

如果我在控制台中用p value打印value的值,它会显示0x1 <error: cannot access memory at adress 0x1,我假设它是一个空指针,但为什么呢?令牌中应该有CCD_ 5。对我缺少什么有什么见解吗?

使用最新的GCC编译程序会产生以下警告:

t.c: In function ‘main’:
t.c:15:23: warning: assignment to ‘char *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
15 |             if((value = strtok(NULL, " tn")!=NULL))  /*seg.falt causes here*/
|                       ^

修复括号以执行希望他们执行的操作很有可能会修复崩溃:

if ((value = strtok(NULL, " tn")) != NULL)

附言:你应该养成用gcc -Wall -Wextra构建程序的习惯。

发现了这个问题,它很烦人:

if((value = strtok(NULL, " tn")!=NULL))
^

应该是:

if((value = strtok(NULL, " tn"))!=NULL)
^

相关内容

  • 没有找到相关文章

最新更新