0

如何在循环中使用 getchar()?我现在有...

for (p=0; p<n_players; p++) {
    ...
    fflush(stdin);
    getchar();
}

但它不起作用......如果n_players是3,它只在最后执行getchar 2次......

for (p=0; p<n_players; p++) {
    blank_start();
    ascii_art_title();
    printf("%s, tocca a te...\n",player_info[p].player_name);
    srand(time(NULL));
    random_speed = MIN_WHEEL_SPEED + rand()%MAX_WHEEL_SPEED;
    move_wheel_pointer(random_speed, &pointer);
    if (player_points(&wheel[pointer]) == 0){
        player_info[p].points = wheel[pointer];
    }
    else {
        player_info[p].points = 0;
    }
    printf("\nGuadagni %d punti...\n",player_info[p].points);
    if (p<(n_players-1)) {
        printf("\nOra tocca a te, giocatore %d\n",(p+2));
    }
    fflush(stdin);
    getchar();
}

getchar 跳过第一个循环

4

4 回答 4

7

首先,刷新输入流的结果是不确定的。其次,“行不通”并没有给我们太多可做的事情。

于 2010-01-06T17:16:53.817 回答
4

fflush的行为未在输入流上定义,因此呈现的代码是无意义的。

如果 n_players 为 3,则该循环确实会发生 3 次。

于 2010-01-06T17:17:12.217 回答
2

1] 输入流上的 fflush 是未定义的行为。

2] 您的循环确实执行了 3 次。第二次调用 getchar() 将使用ENTER第一次输入时放在那里的流中的密钥。因此,您认为它只被调用了两次。

简而言之,再放一个 getchar() 来消耗\n. 这将解决你的问题。

于 2010-01-06T17:27:10.187 回答
2

getchar()不是处理用户输入的好选择。话虽如此,如果您仍想使用该功能,可以尝试不使用fflush并堆积两个调用getchar

像这样的东西:

for (p=0; p<n_players; p++) {
   ...
   c = getchar(); // c will hold character read
   getchar(); // will consume '\n'
}

问题getchar()是它返回键盘缓冲区中可用的下一个字符。因此,如果您执行c = getchar()并且用户执行以下操作:

E'\n'

(意味着他/她按字符 E 后按 ENTER)

c将保留值'E',并且下一次调用getchar()将消耗用户按下的 ENTER ('\n')。

因此,如您所见,它非常棘手且难以正确控制。

如果是为了测试一些代码,OK。如果是用于实际应用程序,请尝试使用平台相关库进行用户输入(Windows 上的 Win32、Linux 上的 GTK、Linux 上的 ncurser 等)

于 2010-01-06T17:26:12.957 回答