这是我正在使用C语言编写的程序的基本代码 . 我试图检测输出文件是否已经存在,如果它确实存在,我想询问用户是否要覆盖它 . 这就是我首先使用fopen(outfilename,“r”)打开outfilename文件的原因;而不是fopen(outfilename,“w”);.
它检测文件不存在的情况,但是,如果它确实存在则执行printf(“输出文件已存在,覆盖(y / n):”);声明但完全忽略了scanf(“%c”,&yn);声明!
如果文件不存在,程序末尾的printf读取“yn = 0”,如果存在,则读取“yn =” . 有谁能够帮我?
#include <stdio.h>
#include <stdlib.h>
#include <float.h>
#include <string.h>
int main(void) {
FILE *inf;
FILE *outf;
char filename[21],outfilename[21];
char yn='0';
printf("Please enter an input filename: ");
scanf("%s",&filename);
printf("Please enter an output filename: ");
scanf("%s",&outfilename);
/* Open file for reading */
inf=fopen (filename,"r");
outf=fopen(outfilename,"r");
/*check that input file exists*/
if (inf!=NULL) {
/*check that the output file doesn't already exist*/
if (outf==NULL){
fclose(outf);
/*if it doesn't already exist create file by opening in "write" mode*/
outf=fopen(outfilename,"w");
} else {
/*If the file does exist, give the option to overwrite or not*/
printf("Output file already exists, overwrite (y/n):");
scanf("%c",&yn);
}
}
printf("\n yn=%c \n",yn);
return 0;
}
5 回答
当您输入第二个字符串并按ENTER键时,字符串和字符放在输入缓冲区中,它们是:输入的字符串和换行符 . 字符串被_1084614消耗,但换行符仍然在输入中缓冲 .
进一步,
用于读取字符的下一个
scanf
只读取/使用换行符,因此永远不会等待用户输入 .解决方案是使用以下内容消耗额外的换行符:
或者使用
getchar()
您可能需要查看我的答案 here ,以获得详细的问题解答 .
使用
并记住stdin是行缓冲的,并且在Linux上遵循tty规则
如果想要更详细的控制,可以使用GNU readline或ncurses .
scanf("%s", ...)
离开\ n终止输入中的行 . 它不会导致下一个问题,因为scanf("%s",...)通过跳过白色开始 .scanf("%c", ...)
没有,因此您阅读\n
.BTW您可能遇到其他问题是您在文件名中放置空格(
%s
不读取它们)以及输入的名称太长(%s没有输入长度限制) .你抱怨的问题(但不是另一个)的一个解决方案是使用
scanf(" %c", ...)
(参见%c
之前的空格?scanf
使用起来很棘手),这是从跳过空格开始的 .也删除&
scanf.c:13:警告:格式'%s'期望类型'char ', but argument 2 has type ' char()[20u]'
我发现处理这个问题的更好方法是explained here .
它建议使用另一种处理输入的方法,并得到很好的解释 .
我总是使用这个函数来获取用户输入 .
旧答案
我用这条规则解决了这类问题:
如果你在任何输入后做这个,应该没有问题 .