为了账号安全,请及时绑定邮箱和手机立即绑定

程序不会等待用户使用scanf(“%c”,&yn);的输入;

程序不会等待用户使用scanf(“%c”,&yn);的输入;

C
POPMUISE 2019-09-26 14:46:09
程序不会等待用户使用scanf(“%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;}
查看完整描述

3 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

printf("Please enter an output filename: ");    scanf("%s",&outfilename);

当您输入第二个字符串并按ENTER键时,一个字符串和一个字符将被放置在输入缓冲区中,它们分别是:输入的字符串和换行符。该字符串被消耗,scanf但换行符仍保留在输入缓冲区中。

进一步,

scanf("%c",&yn);

下一个scanf用于读取字符的字符仅读取/使用换行符,因此从不等待用户输入。

解决方案是使用以下命令消耗多余的换行符:

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

或使用 getchar()

您可能需要在这里查看我的答案,以逐步详细地解释问题。


查看完整回答
反对 回复 2019-09-26
?
交互式爱情

TA贡献1712条经验 获得超3个赞

采用

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

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

如果需要更详细的控制,可以使用GNU readlinencurses


查看完整回答
反对 回复 2019-09-26
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

scanf("%s", ...)使\ n终止输入中的行。它不会引起下一个问题,因为scanf(“%s”,...)以跳过白色开始。 scanf("%c", ...)不会,因此您阅读了\n

顺便说一句,您可能还会遇到其他问题,即在文件名中放置空格(%s不读取它们),并且如果输入的名称太长(%s没有输入长度限制)。

解决您抱怨的问题的一种方法(而不是另一种方法)是使用scanf(" %c", ...)(请参阅%c?之前的空格scanf很难使用),该方法首先跳过空白。


查看完整回答
反对 回复 2019-09-26
  • 3 回答
  • 0 关注
  • 669 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信