【问题标题】:segmentation fault from strtok [closed]来自strtok的分段错误[关闭]
【发布时间】:2020-07-15 19:47:33
【问题描述】:

我正在尝试一个简单的程序,该程序将从输入中读取一个字符串、一个大写字母和 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 &lt;error: cannot access memory at adress 0x1,并且我假设它是一个空指针,但为什么呢?令牌中应该有2。 关于我缺少什么的任何见解?

【问题讨论】:

  • strtok 不会返回浮点数(%f 格式字符串)
  • 啊,我的错,改成:sscanf(token, "%f", &y); printf("%f\n",y);但我仍然看到 x 没有从 sscanf 获得正确的值 (1)。 sscanf 是否应该从 char-string 令牌中获取浮点数并将其分配给 x?
  • 您有int x, y,因此请尝试在sscanfprintf 中使用"%d",或更改为float x, y
  • 我也无法重现该段。错误,请尝试通过minimal reproducible example 指出问题
  • @ackdary 我认为这是我可以将代码缩短到核心问题的最好方法

标签: c segmentation-fault strtok


【解决方案1】:

使用最新的 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)

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

【讨论】:

【解决方案2】:

发现了问题,而且很烦人:

if((value = strtok(NULL, " \t\n")!=NULL))
                                        ^

应该是:

if((value = strtok(NULL, " \t\n"))!=NULL)
                                 ^

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多