首页 文章

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

提问于
浏览
6

这是我正在使用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 回答

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

    当您输入第二个字符串并按ENTER键时,字符串和字符放在输入缓冲区中,它们是:输入的字符串和换行符 . 字符串被_1084614消耗,但换行符仍然在输入中缓冲 .

    进一步,

    scanf("%c",&yn);
    

    用于读取字符的下一个 scanf 只读取/使用换行符,因此永远不会等待用户输入 .

    解决方案是使用以下内容消耗额外的换行符:

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

    或者使用 getchar()

    您可能需要查看我的答案 here ,以获得详细的问题解答 .

  • 0

    使用

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

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

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

  • 0

    scanf("%s", ...) 离开\ n终止输入中的行 . 它不会导致下一个问题,因为scanf("%s",...)通过跳过白色开始 . scanf("%c", ...) 没有,因此您阅读 \n .

    BTW您可能遇到其他问题是您在文件名中放置空格( %s 不读取它们)以及输入的名称太长(%s没有输入长度限制) .

    你抱怨的问题(但不是另一个)的一个解决方案是使用 scanf(" %c", ...) (参见 %c 之前的空格? scanf 使用起来很棘手),这是从跳过空格开始的 .

  • 0
    scanf("%s",&filename);
    

    也删除&

    scanf.c:13:警告:格式'%s'期望类型'char ', but argument 2 has type ' char()[20u]'

  • 1

    我发现处理这个问题的更好方法是explained here .

    它建议使用另一种处理输入的方法,并得到很好的解释 .

    我总是使用这个函数来获取用户输入 .

    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.
    

    如果你在任何输入后做这个,应该没有问题 .

相关问题