c - getchar() 的奇怪行为

标签 c io scanf getchar

getchar() 和 scanf 的奇怪行为出现在下面的代码中: 如果我在 /*K1*/ch = getchar(); 行中插入,代码在 /*k*/ 行中正常工作。

我的意思是,如果不在 /*k1*/ 行中调用 getchar,编译器不会从键盘请求一个字符。另一方面,如果包含一个额外的 getchar,程序将完美运行。有人可以给我铃吗?

int INcoord(int n, int **Coo){/*retorna quantidade de dados lida em coordPontos.dat*/
    FILE *fp;           /*Arquivos de leitura e gravacao. */
    char dummy[MAXSTR];      /*informacoes para o usuario nos arquivos de leitura.*/
    int i, j;
    int m;
    char ch;

    printf("Entrada por coordenadas de pontos.\n");
    printf("Leitura das coordenadas com numeros inteiros.\n");
    printf("Arquivo de leitura: coordPontos.dat\n");

    if((fp=fopen("coordPontos.dat","r"))==NULL){
        printf("Arquivo não pode ser aberto.\n"); exit(1); }

    fgets(dummy,MAXSTR,fp); /*Apresentacao do arquivo*/
    fgets(dummy,MAXSTR,fp); /*texto 1*/


    fscanf(fp,"%i ",&m);
    /*K1*/           ch= getchar();

    if(m<n){

        printf("Quantidade de dados menor que o previsto para cadeia do frio.\nVerificar entradas\n");


        printf("Deseja prosseguir programa com a quantidade prevista em coordPontos.dat?\n");

        printf("S - sim\n"); printf("Outra letra - aborta programa\n");
        /*k*/            ch= getchar();

        if (ch=='S' || ch =='s')n=m; /*funçao retorna quantidade de dados usada. */


        else {
            printf("programa abortado.\n");
            exit(1); /*aborta programa */
        }

    }

    fgets(dummy,MAXSTR,fp); /*Texto 2*/
    fscanf(fp,"%i ",&j);


    fclose(fp);

    printf("Teste i = %i, j = %i\n", m, j);

    return n;
}

最佳答案

第二次调用 getchar() 从流缓冲区返回 '\n' 字符。而是使用

#include <conio.h>

char input = getche();

为了只得到一个字符。当然,您需要包括错误检查,因为 getche() 还会返回 F1-F12 等特殊键。

关于c - getchar() 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16340609/

相关文章:

c - `close()` 是否刷新缓冲输出数据?

java - 如何编辑具有预定义值的数组以包含用户输入 JAVA

Haskell IO 平均函数 IO,纯 vs 非纯尝试

C 中的命令解析器

c - `clang -ansi` 扩展名

c - 写入后文件中的垃圾值

c - scanf读取每一个双错

c - scanf AFTER fgets 破坏了 fgets 语句

c - scanf 中的 %d 不工作。号码 4223092 出现

c - 管道的尺寸是多少