-2

文字を 1 つずつ読み取り、累積的に int に変換しようとしています。ユーザーが数字以外の文字を入力すると、プロセス全体が最初からやり直されます。このコードgetchar()を実行すると、キーを押すたびに実行するのではなく、Enter キーを押した後にのみ以下のコードが実行されます。簡単に言えば、一度に 1 文字ではなく、Enter で終わる文字列を入力として受け取り、入力文字列から一度に 1 文字を読み取り、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 設定に依存するためです。ほとんどの端末では行バッファリングが有効になっているため、Enter キーを押すまで待機します。を使用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 に答える