【问题标题】:A strange behaviour of getchar()getchar() 的奇怪行为
【发布时间】:2013-05-02 14:23:50
【问题描述】:

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;
}

【问题讨论】:

  • 请修复代码标签?阅读“如何提出一个好问题”以了解如何做到这一点。
  • 您应该检查fgetsfscanf!... 的返回值,而getchar 返回int,而不是char。虽然返回值是int 的形式,但您需要确保它不是负数。负数表示错误。将其转换为char 后,您将无法执行此操作。

标签: c io scanf getchar


【解决方案1】:

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

#include <conio.h>

char input = getche();

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

【讨论】:

  • 这是特定于 Windows(或 MS-DOS)的。
  • @KeithThompson:你错了。 &lt;conio.h&gt; 实际上是一个支持 windows 的 UNIX 头文件。
  • getche 返回指向militant_coup_leader 的指针,而不是char
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多