-2

我正在尝试一次读取一个字符并以累积方式将它们转换为 int 。如果用户输入数字以外的字符,我将重新开始整个过程​​。当我运行这段代码时,下面的代码getchar()只有在我按下回车键后才会执行,而不是每次按键都执行。简而言之,它不是一次取一个字符,而是取一个以 enter 结尾的字符串作为输入,然后从输入字符串中一次读取一个字符并执行 while 循环。我很确定它与\nprintf 语句中的有关。我的c代码:

    char* input=malloc(0);
    char c; 
    int count=0;
    int a;
    int b;  
    errno=0;
    printf("\nEnter two numbers a and b\n");

    while(1){
        count++;
        printf(":Count:%d",count);
        c=getchar();
        printf("\n::%c::\n",c);
        if(c=='\n')
            break;
        input=realloc(input,count);
        input[count-1]=c;
        errno=0;
        a=strtol(input,NULL,10);
        printf("\nNUMber::%d\n",a);
        if (errno == ERANGE && (a == LONG_MAX || a == LONG_MIN)){
            printf("\nLets start over again and please try entering numbers only\n");
            count=0;
            input=realloc(input,0);     
        }
    }
4

2 回答 2

1

这是因为getchar()终端 io 设置依赖的事实。由于大多数终端都启用了行缓冲,它会一直等到您按下回车键。使用termios.h,您可以禁用它。getch()仅适用于 Windows。

这是一些getch()在 Linux 中执行操作的代码。

#include <termios.h>

char getch(void) {
    /* get original settings */
    struct termios new, old;
    tcgetattr(0, &old);
    new = old;

    /* set new settings and flush out terminal */
    new.c_lflag &= ~ICANON;
    tcsetattr(0, TCSAFLUSH, &new);

    /* get char and reset terminal */
    char ch = getchar();
    tcsetattr(0, TCSAFLUSH, &old);

    return ch;
}

还有,为什么realloc(blah, 0)?为什么不只是free(blah)?此外,malloc(0)是未定义的行为。它可以返回 NULL 或给出一个唯一的指针。与 相同realloc(blah, 0)

于 2013-10-11T11:44:55.360 回答
0

只需使用:

#include <stdlib.h>

char getch()
{
char c; // This function should return the keystroke

system("stty raw");    // Raw input - wait for only a single keystroke
system("stty -echo");  // Echo off

c = getchar();

system("stty cooked"); // Cooked input - reset
system("stty echo");   // Echo on - Reset

return c;
}
于 2013-10-11T13:01:18.723 回答