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