2013-05-02 114 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