控制台没有等待输入。 (C语言)

时间:2016-09-28 14:32:01

标签: c console-application

当我执行下面的代码时。它等待输入文件名的输入。但它不会等我输入文件名,而只是跳过它到_getch()部分。我无法添加句子。

代码无效:

#include <stdio.h>

main() {

    FILE *fp;
    char fnamer[100] = "";      //Storing File Path/Name of Image to Display
    printf("\n\nPlease Enter the Full Path of the Image file you want to view: \n");
    scanf("%s", &fnamer);
    fp = fopen(fnamer, "w");
    if (fp == NULL)
    {
        printf("\n%s\" File NOT FOUND!", fnamer);
    }
    char c[1000];
    printf("Enter a sentence:\n");
    gets(c);
    fprintf(fp, "%s", c);
    fclose(fp);
    _getch();
}

有效的代码并等待输入句子:

#include <stdio.h>
#include <stdlib.h>  /* For exit() function */
int main()
{
    char c[1000];
    FILE *fptr;
    fptr = fopen("program.txt", "w");
    if (fptr == NULL){
        printf("Error!");
        exit(1);
    }
    printf("Enter a sentence:\n");
    gets(c);
    fprintf(fptr, "%s", c);
    fclose(fptr);
    return 0;
}

两者在最后都是如此相似,以便提示要求判刑。这没有意义。

4 个答案:

答案 0 :(得分:0)

使用scanf后必须刷新输入。

在每次扫描后放置一个getchar()

答案 1 :(得分:0)

使用stdin接收输入时遇到一个非常常见的问题,即在第一次 scanf 调用之后,有一个悬空的 \ n 字符卡在了来自回车键的缓冲区。要以简单的便携式方式清除此缓冲区,请添加类似

的内容
char c;
while ( (c = getchar()) != '\n' && c != EOF ) { }  

这只是初始化一个字符,然后根据需要多次调用get char,直到它达到'\ n'或'EOF',这就是你的情况。

tl;博士: 你的缓冲区看起来像这样

hello.txt\n <-- "comes from the enter key"

当你尝试使用get(c)时,它将\ n作为下一个输入键。

答案 2 :(得分:0)

规则是永远不要混合scanf而[f]得到scanf在下一个未使用的字符之前停止,通常为空白,行尾由空白字符组成。

您可以尝试在最后fgets和第一个真实scanf之间放置一个虚拟fgets。这将确保您在阅读之前现在位于行首。或者,您可以使用fgets读取所有内容,并使用sscanf解析这些行。一旦我希望我的输入是面向行的,那就是我喜欢的。并且总是控制输入函数的返回值,它会避免程序突然变得疯狂而没有任何指示只是因为一个输入给出了忽略的错误。

最后也是最重要的一点:永远不会使用gets而只使用fgets ,前者在耻辱的大厅中已经存在数十年,因为无法缓冲的缓冲区溢出的原因

代码可能变成:

#include <stdio.h>
#include <string.h>

main() {

    FILE *fp;
    char fnamer[100] = "";      //Storing File Path/Name of Image to Display
    char c[1000], *ix;
    int cr;
    printf("\n\nPlease Enter the Full Path of the Image file you want to view: \n");
    cr = scanf("%s", &fnamer);
    if (cr != 1) {
        // process error or abort with message
    }
    fp = fopen(fnamer, "w");
    if (fp == NULL)
    {
        printf("\n%s\" File NOT FOUND!", fnamer);
        return 1; // do not proceed after a fatal error!
    }
    for(;;) {  // read until a newline in input
        ix = fgets(c, sizeof(c), stdin);
        if (ix == NULL) {
            // end of input: abort
        }
        if (strcspn(c, "\n") < strlen(c)) break;
    }
    printf("Enter a sentence:\n");
    ix = fgets(c, sizeof(c), stdin);
    c[strcspn(c, "\n")] = '\0'; // remove end of line to get same data as gets
    fprintf(fp, "%s", c);
    fclose(fp);
    _getch();
}

答案 3 :(得分:0)

main() {

  FILE *fp;
    char fnamer[100]="";        //Storing File Path/Name of Image to Display
    printf("\n\nPlease Enter the Full Path of the Image file you want to view: \n");
    fgets ( fnamer,100,stdin); //fgets(name, sizeof(name), stdin);
    fp=fopen(fnamer,"w");
            if(fp==NULL)
        {
            printf("\n%s\" File NOT FOUND!",fnamer);
            getch();
            exit(1);
        }

}

我认为最好的方法是使用fgets scanf {I}},因为 fgets()可以读取任何打开的文件,但scanf()只读取标准输入(用户给定)。

fgets()从文件中读取一行文字; scanf()可以用于此但也可以处理转换 从字符串到内置数字类型