gpt4 book ai didi

c - 多次调用fread使程序行为异常

转载 作者:行者123 更新时间:2023-11-30 20:27:21 25 4
gpt4 key购买 nike

Thank you for all advices, I solved the problem and it is function call overflow. Yes, the code is really a mass and ugly so I managed to clean it up, I will replace the code with the new one here.

这是我最后一年的项目,我正在尝试编写一个c程序来读取多个.c代码并修改它,然后编译并运行它,最后读取ouput.txt并将其与ans.txt进行比较。

我遇到了一个奇怪的问题,代码符合要求,没有任何警告,但是当我尝试在命令行运行它时,它什么也不做,只是显示一个空行。

经过几次测试,我发现如果我注释一行代码,即调用 fread 函数,程序就可以正常运行。我不明白原因以及如何解决。

当程序运行时,命令行中应该是这样的:
C:\batch.exe
欢迎使用批处理系统
(开始处理)...

但是,我现在得到了这个:
C:\batch.exe

C:\

这是我的代码的主要部分:

int main(){
int agu = 1, fim; // agument for controlling the program
int filesize[256]; //used on sacn()
int num = 0; // stores total number of files detected
char sdir[] = "./input/", filter[]= "*.c", filename[128][256]; //Varibies used on auto-detecting
struct _finddata_t c_file; //Varibies used on auto-detecting
long hFile; //Varibies used on auto-detecting
printf("\nWelcome to the my system");
Sleep(1000);
printf("\nPlease put all files on input folder in order to let this program read it");
Sleep(1000);
fflush(stdout);
do{
_chdir(sdir);
hFile = _findfirst(filter, &c_file);
if (hFile != -1)
{
num = 0;
do{
sprintf(filename[num], "%s", c_file.name);
printf("\n%s\n", filename[num]);
num++;
} while (_findnext(hFile, &c_file) == 0);

}
else{
printf("\nNo .c files found in input folder.\nThe Program will be exit after 5 second.");
Sleep(5000);
return 0;
}
_chdir("..");
printf("\nTotal %d file(s) will be imported", num);
printf("\nConfirm ? (Y / N)\nYou Can Also Press Ctrl + C or Enter Q to Terminate this Program.");
do {
fim = getchar();
putchar(fim);
if (fim == 'Y' || fim == 'y')
agu = 0;
else if (fim == 'Q' || fim == 'q')
return 0;
else agu = 1;
} while (fim != 'y' && fim != 'Y' && fim != 'N' && fim != 'n');


}while(agu==1);
mod(filename,sdir,num); // modify , compile and run the code
printf("\nEnter Y to Start Result Comparing, or Enter N to Exit This Program.(Y/N)");
fim = 'a';
do {
fim = getchar();
putchar(fim);
if (fim == 'Y' || fim == 'y')
agu = 0;
else agu = 1;
} while (fim != 'y' && fim != 'Y' && fim != 'N' && fim != 'n');

if (agu == 0){ //Resulting Comparing Function
comp();
}
else{
printf("\nThank You For Using This Software, This Program will be terminated.");
}
return 0;
}

最佳答案

由于缓冲区溢出,filebuff[x]printf() 可能会打印大量(不可见的)垃圾:

fread() 返回文件内容,不带尾随 '\0'。因此,您会遇到缓冲区溢出,例如在 fread() 之后的 printf() 以及之后的 strlen()scan() 中。有两种(或可能更多)解决方案:

  • 在调用 fread() 后立即在文件内容末尾设置空分隔符:

    filebuff[x][fsize]='\0'

    在作为 C 字符串访问缓冲区之前。

  • 为每个文件创建一个单独的文件大小数组:

    int filesize[256]; filesize[x] = fsize; 

    稍后在 scan()

  • 中使用此大小

引起我注意的其他问题:

  • sizeof(char[xxx]) 始终返回缓冲区的大小,而不是其内容的字符串长度。因此

    sizeof(filebuff[x])   // always returns 2048
    sizeof(inputFiles[x]) // always returns 10
  • 在函数 scan() 中:

    if (input[curr] == 'p' && 
    input[curr + 1] == 'r' &&
    input[curr + 2] == 'i' &&
    input[curr + 3] == 'n' &&
    input[curr + 4] == 't' &&
    input[curr + 5] == 'f'
    )

    也有潜在的缓冲区溢出:如果您几乎到达文件末尾,input[curr + 5] 会读取超过内容末尾的内容。最好使用 strstr() 来代替。

关于c - 多次调用fread使程序行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20634879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com