忽略 fscanf 的 return 值和分段错误

Ignoring return value of fscanf and Segmentation fault

我想知道如何解决我的 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 and I tried to understand what was posted in here 中报告的建议。但是,我没有在我的代码中看到它的应用程序。

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

Segmentation fault (core dumped)`.

在您的代码中,您 fopen() 对文件进行了两次处理。只需摆脱

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

if 语句之前。

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

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

您正在打开文件两次。

你只需要这个:

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