我花了一些时间来弄清楚这个错误,并想知道为什么第二个代码块不起作用。
工作:
FILE *readFile;
FILE *saveFile;
char readFileName;
char saveFileName;
printf("read file name:\n");
scanf("%s", &readFileName);
readFile = fopen(&readFileName, "r");
printf("save file name:\n");
scanf("%s", &saveFileName);
saveFile = fopen(&saveFileName, "w");
不起作用:
FILE *readFile;
FILE *saveFile;
char readFileName;
char saveFileName;
printf("read file name:\n");
scanf("%s", &readFileName);
printf("save file name:\n");
scanf("%s", &saveFileName);
readFile = fopen(&readFileName, "r");
saveFile = fopen(&saveFileName, "w");
答案 0 :(得分:3)
您正在获取对堆栈上分配的单个char
的引用。该指针无效,无法用于对字符数组的引用。
尝试使用用作缓冲区的真实字符数组替换字符串:
char readFileName[128];
scanf("%127s", readFileName);
否则将发生的事情是scanf
,不检查任何内容,将使用从stdio
获取的字符覆盖堆栈中的数据,从而导致stack buffer overflow,这意味着未定义行为。
您可以指定格式说明符中最多要提取的字符数,但请记住减去一个,因为scanf
自动附加null
terminator。
答案 1 :(得分:2)
通过纯粹的运气(未定义的行为),您的程序的一个版本可以正常工作。
char readFileName;
...
scanf("%s", &readFileName);
readFile = fopen(&readFileName, "r");
您正在将整个文件名写入仅一个字节的内存空间!大概你的意思是:
char readFileName[1024];
...
scanf("%s", readFileName);
readFile = fopen(readFileName, "r");
程序的“工作”版本仅覆盖了您不需要立即打开“保存”文件的字节。这就是为什么它似乎正常运行,即使它是错误的。
在使用scanf()
之前,请确保分配足够的空间。