感谢您的所有建议,我解决了问题,这是函数调用溢出。是的,代码实际上是一个质量和丑陋,所以我设法清理它,我将在这里用新的代码替换代码。
这是我的最后一年项目,我正在尝试编写读取多个.c代码并修改它的ac程序,然后编译并运行它,最后读取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;
}
答案 0 :(得分:1)
由于缓冲区溢出,printf()
filebuff[x]
可能会打印大量(不可见)垃圾:
fread()
返回文件内容而不会尾随'\0'
。因此,您会遇到缓冲区溢出,例如printf()
之后的fread()
以及strlen()
和scan()
之后的fread()
。
有两种(或可能更多)解决方案:
在调用filebuff[x][fsize]='\0'
后立即在文件内容末尾设置空分隔符:
int filesize[256]; filesize[x] = fsize;
在以C-string访问缓冲区之前。
为每个文件创建一个单独的文件大小数组:
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()
的末尾读取了内容的结尾。更好地使用{{1}}代替。
答案 1 :(得分:0)
stdout
是行缓冲的。如果您打印没有结尾\n
的内容,则需要刷新stdout
。
printf("\nWelcome to the batching system");
fflush(stdout); // Added line
Sleep(1000);
现在,您的程序正在等待输入,但您没有意识到,因为提示文本仍在打印缓冲区中。