忽略 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 */ }
我想知道如何解决我的 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 */ }