C – getchar()在循环中?

我如何在循环中使用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跳过第一个循环

首先,刷新输入流的结果是不确定的。 其次,“不起作用”并没有给我们带来很多东西。

fflush的行为没有在输入流上定义,因此所呈现的代码是荒谬的。

如果n_players为3,那个循环确实会发生3次。

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

像这样的东西:

 for (p=0; p 

使用getchar()是它返回键盘缓冲区中可用的下一个字符。 所以,如果你做一个c = getchar() ,用户会:

E '\ n'

(意思是他/她按下字符E后跟ENTER)

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

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

如果是用于测试某些代码,那么确定。 如果是真实应用程序,请尝试使用平台相关库来进行用户输入(Windows上为Win32,Linux上为GTK,Linux上为ncurser等)

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

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

Inshort,再放一个getchar()来消耗\n 。 这将解决您的问题。