程序不等待用户inputscanf(“%c”,&yn);

这是一个程序的基本代码,我正在编写的实践中使用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; } 
 printf("Please enter an output filename: "); scanf("%s",&outfilename); 

当你input第二个string并按ENTER键时,一个string和一个字符被放置在input缓冲区中,它们分别是:input的string和换行符。string被scanf消耗,但换行符保留在input缓冲。

进一步,

 scanf("%c",&yn); 

读取字符的下一个scanf只读取/消耗换行符,因此不会等待用户input。

解决scheme是通过使用以下消耗额外的换行符:

 scanf(" %c", &yn); ^^^ <------------Note the space 

或者通过使用getchar()

你可能想看看我的答案在这里详细的一步一步解释的问题。

使用

 scanf("%20s",&filename); 

并记住stdin是行缓冲的,在Linux上遵循tty规范

如果你想更详细的控制,你可以使用GNU readline或者ncurses 。

scanf("%s", ...)离开\ n终止input中的行。 scanf(“%s”,…)以跳过白色开始,这不会导致下一个问题。 scanf("%c", ...)不会,因此您阅读\n

顺便说一句你可能会遇到其他问题,你把空格放在你的文件名( %s不读取它们),如果你input太长的名字(%s没有input长度的限制)。

对于你所抱怨的问题(而不是另一个)的一个解决scheme是使用scanf(" %c", ...) (请参阅%cscanf之前的空间使用起来比较棘手),它以跳过空格开始。

 scanf("%s",&filename); 

也删除“

scanf.c:13:警告:format'%s'需要键入'char ',但是参数2的types是'char( )[20u]'

处理这个问题的更好方法是在这里解释 。

它build议使用另一种处理input方式,并且很好地解释。

我总是使用这个function来获得用户input。

 char * read_line (char * buf, size_t length) { /**** Copyright de home.datacomm.ch/t_wolf/tw/c/getting_input.html#skip Read at most 'length'-1 characters from the file 'f' into 'buf' and zero-terminate this character sequence. If the line contains more characters, discard the rest. */ char *p; if ((p = fgets (buf, length, stdin))) { size_t last = strlen (buf) - 1; if (buf[last] == '\n') { /**** Discard the trailing newline */ buf[last] = '\0'; } else { /**** There's no newline in the buffer, therefore there must be more characters on that line: discard them! */ fscanf (stdin, "%*[^\n]"); /**** And also discard the newline... */ (void) fgetc (stdin); } /* end if */ } /* end if */ return p; } /* end read_line */ 

老答案

我用这个规则解决了这样的问题:

 // first I get what I want. c = getchar(); // but after any user input I clear the input buffer // until the \n character: while (getchar() != '\n'); // this also discard any extra (unexpected) character. 

如果您在input任何内容后,应该没有问题。