getchar()的奇怪行为

时间:2013-05-02 14:23:51

标签: c io scanf getchar

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

我的意思是,如果没有在行getchar中调用/*k1*/,编译器就不会要求键盘输入字符。另一方面,如果包含额外的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;
}

1 个答案:

答案 0 :(得分:0)

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

#include <conio.h>

char input = getche();

为了只获得一个角色。当然,您需要包含错误检查,因为getche()也会返回特殊键,如F1-F12。