2013-05-02 42 views
1

在下面的代碼中出現了一個奇怪的行爲getchar()和scanf: 如果我插入行/*K1*/ ch = getchar();代碼在行/*k*/正常工作。getchar()的一個奇怪的行爲

我的意思是,在/*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; 
} 
+0

請修復代碼標籤?閱讀「如何提出一個好問題」來學習如何去做。 – Meoiswa 2013-05-02 14:30:54

+0

你應該檢查'fgets'和'fscanf'的返回值!...和'getchar'返回一個'int',而不是'char'。雖然返回值的形式爲int,但您需要確保它不是負數。否定意味着錯誤。在將其轉換爲char字符後,您無法執行此操作。 – Sebivor 2013-05-08 19:36:13

回答

0

getchar()第二調用返回從流緩衝器中的「\ n」字符。相反使用

#include <conio.h> 

char input = getche(); 

爲了得到只有一個字符。當然你需要包含錯誤檢查,因爲getche()也會像F1-F12這樣的特殊鍵返回。

+2

這是特定於Windows(或MS-DOS)。 – 2013-05-02 15:48:22

+0

@凱瑟湯普森:你錯了。 ''實際上是一個支持Windows的UNIX頭文件。 – Philip 2013-05-02 18:35:47

+2

[真的嗎?](http://en.wikipedia.org/wiki/Conio.h) – 2013-05-02 18:38:46