【问题标题】:Ignoring return value of fscanf and Segmentation fault忽略 fscanf 的返回值和分段错误
【发布时间】:2015-09-01 14:32:07
【问题描述】:

我想知道如何在我的 C 代码上解决 Core dumped issue

当我用:g++ -g MatSim.cpp -o MatSim -lstdc++ -O3 编译它时,我收到三个警告,这是一个(其他两个类似,仅通过字符串变量名区分):

MatSim.cpp: In function ‘int main()’:
MatSim.cpp:200037:27: warning: ignoring return value of ‘int fscanf(FILE*, const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
 fscanf(TM,"%255s",string2);

我的代码的主要方面以及编译器报告的相关部分:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

int to_int(char string[256])
{
    if( strcmp(string,"0") == 0 )
    {
        return 0;
    }

...

    else if( strcmp(string,"50000") == 0 )
    {
        return 50000;
    }
    return -1;
}   

int main()
{
int a,b,div,value,k,i,j,tm,ler; 
    char string[256];
    char string1[256];
    char string2[256];

FILE *TM;
TM = fopen("TM","r");
if( (TM = fopen("TM","r")) == NULL)
{  
    printf("Can't open %s\n","TM");
    exit(1);
}
fscanf(TM,"%255s",string2);
tm = to_int(string2);
fclose(TM);

...

}

我已经尝试了here 中报告的建议,并试图了解here 中发布的内容。但是,我没有在我的代码中看到它的应用程序。

最后,当我运行exe文件时,它返回:

分段错误(核心转储)`。

【问题讨论】:

  • TM = fopen("TM","r"); if( (TM = fopen("TM","r")) 为什么要打开文件两次?
  • 我的难处是:首先打开文件,然后检查文件是否正常
  • MatSim.cpp:200037:27 - 哇。 谢谢没有发布其他 200000 行代码。
  • @beginner 但这不是你的代码所做的。
  • @beginner 另外,如果你使用 C++,你应该注意streamsstd::string 的用法。所以选择一种语言——是 C 还是 C++?

标签: c segmentation-fault fopen


【解决方案1】:

在您的代码中,您 fopen()ing 该文件两次。只需摆脱

 TM = fopen("TM","r");

if 语句之前。

也就是说,您应该检查fscanf() 的值以确保成功。否则,您最终会读取一个未初始化的数组 string2,它不是以空值结尾的,它反过来会调用 undefined behaviour

请注意,几乎所有与string 相关的函数都需要一个以空字符结尾的字符数组。如果你的数组不是空终止的,就会有 UB。此外,初始化您的自动局部变量是一个很好的做法,以避免在后面的代码部分中出现可能的 UB。

【讨论】:

  • 感谢您的回复,但我尝试了两种建议,但都没有奏效:(
  • 谢谢您,唯一省略警告的补充是消除-O3。其余的你是对的(+1)并首先检查答案。祝你有美好的一天:)。
【解决方案2】:

您打开文件两次。

你只需要这个:

FILE *TM = fopen("TM","r");
if (TM == NULL)  { /* file was not opened */ }

【讨论】:

  • 感谢您的回复,但我尝试了两种建议,但都没有奏效:(
  • 不,代码有效。如果无法打开文件TM 进行读取,则TM 为NULL。检查TM 的设置。所以这两行确实有效。由于上述原因,您的尝试绝对没有奏效。如果您还有其他问题,那么是代码的其他部分(我敢打赌是字符串处理的东西)导致了问题。
  • 是的,你是对的,唯一省略警告的补充是消除 -O3。其余的你是对的(+1)。祝你有美好的一天:)
猜你喜欢
  • 1970-01-01
  • 2022-06-14
  • 2017-03-29
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多