来自 strtok 的分段错误
segmentation fault from strtok
我正在尝试一个简单的程序,该程序将从输入中读取一个字符串、一个大写字母和 2 个浮点数。
无论我如何调试、更改或检查代码或输入,我都会在最后一次读取令牌时出现分段错误。
我输入的输入是:text A,1,2
。我希望程序忽略大写字母和值之间的所有空格和逗号。
#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 input\n");
string = strtok(buffer, " ");
if(strcmp(string, "text")==0){
if((value = strtok(NULL, " \t\n")!=NULL)) /*seg.falt causes here*/
sscanf(value, " %f", &x); /*or here*/
}
}
如果我在控制台中使用 p value
打印 value
的值,它显示 0x1 <error: cannot access memory at adress 0x1
并且我假设它是一个空指针,但为什么呢?令牌中应包含 2
。
关于我缺少什么的任何见解?
使用最新的 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, " \t\n")!=NULL)) /*seg.falt causes here*/
| ^
修复括号以执行您希望他们执行的操作很可能会修复崩溃:
if ((value = strtok(NULL, " \t\n")) != NULL)
P.S。您应该养成使用 gcc -Wall -Wextra
.
构建程序的习惯
找到了问题,它很烦人:
if((value = strtok(NULL, " \t\n")!=NULL))
^
应该是:
if((value = strtok(NULL, " \t\n"))!=NULL)
^
我正在尝试一个简单的程序,该程序将从输入中读取一个字符串、一个大写字母和 2 个浮点数。
无论我如何调试、更改或检查代码或输入,我都会在最后一次读取令牌时出现分段错误。
我输入的输入是:text A,1,2
。我希望程序忽略大写字母和值之间的所有空格和逗号。
#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 input\n");
string = strtok(buffer, " ");
if(strcmp(string, "text")==0){
if((value = strtok(NULL, " \t\n")!=NULL)) /*seg.falt causes here*/
sscanf(value, " %f", &x); /*or here*/
}
}
如果我在控制台中使用 p value
打印 value
的值,它显示 0x1 <error: cannot access memory at adress 0x1
并且我假设它是一个空指针,但为什么呢?令牌中应包含 2
。
关于我缺少什么的任何见解?
使用最新的 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, " \t\n")!=NULL)) /*seg.falt causes here*/
| ^
修复括号以执行您希望他们执行的操作很可能会修复崩溃:
if ((value = strtok(NULL, " \t\n")) != NULL)
P.S。您应该养成使用 gcc -Wall -Wextra
.
找到了问题,它很烦人:
if((value = strtok(NULL, " \t\n")!=NULL))
^
应该是:
if((value = strtok(NULL, " \t\n"))!=NULL)
^