程序不等待用户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", ...)
(请参阅%c
? scanf
之前的空间使用起来比较棘手),它以跳过空格开始。
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任何内容后,应该没有问题。