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)
^