0

我花了一段时间才弄清楚这个错误,并想知道为什么第二个代码块不起作用。

在职的:

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");
4

2 回答 2

3

char您正在获得对堆栈上分配的单个的引用。该指针不能用作对字符数组的引用。

尝试用用作缓冲区的真实字符数组替换您的字符串:

char readFileName[128];
scanf("%127s", readFileName);

否则会发生什么scanf,它不检查任何东西,将用从中获取的字符覆盖堆栈上的数据stdio,导致堆栈缓冲区溢出,这意味着未定义的行为。

您可以在格式说明符中指定最多获取多少个字符,但请记住减去一个,因为null终止符本身会自动附加scanf

于 2012-10-04T03:37:26.500 回答
2

您的程序的一个版本可以正常工作,这纯属运气(未定义的行为)。

char readFileName;
...
scanf("%s", &readFileName);
readFile = fopen(&readFileName, "r");

您正在将整个文件名写入只有一个字节的内存空间!大概你的意思是:

char readFileName[1024];
...
scanf("%s", readFileName);
readFile = fopen(readFileName, "r");

您的程序的“工作”版本只是覆盖了您不需要立即打开“保存”文件的字节。这就是为什么它似乎可以正常运行,即使它是错误的。

使用前一定要分配足够的空间scanf()

于 2012-10-04T03:37:56.860 回答