int main(int argc, char** argv)
{
char op;
do
{
printf("¿Sigues?");
scanf("%c",&op);
}while(op=='s' || op=='S');
return 0;
}
答案 0 :(得分:2)
您的问题是%c
转换说明符不会导致scanf()
跳过前导空格。在阅读输入后,您需要处理仍在流中的换行符。
第一次通过循环调用scanf()
时输入流为空,因此等待您输入内容。您键入s
并按Enter键,因此输入流包含字符s
和\n
(换行符)。 scanf()
从输入流中删除s
并将其分配给op
。当第二次调用scanf()
时,输入流不为空;它仍然包含\n
字符,因此scanf()
读取它并将其分配给op
,这会导致循环条件失败,因此循环退出。
有几种方法可以解决这个问题。我将建议使用fgets()
阅读字符串而不是单个字符,如下所示:
char op[3] = {0}; // input character + newline character + 0 terminator
do
{
printf("¿Sigues?");
if (fgets(op, sizeof op, stdin))
{
/**
* Check for a newline character in the input. If it's not there
* then the user typed in too many characters. In order to keep
* the input stream from getting clogged up with bad input, read
* until we find a newline character.
*/
char tmp[3];
char *newline = strchr(op, '\n');
while (!newline && fgets(tmp, sizeof tmp, stdin))
{
newline = strchr(tmp, '\n');
}
}
else
{
printf("Error while reading input\n");
op[0] = 0;
}
} while (tolower(op[0]) == 's');
答案 1 :(得分:1)
op = getc(stdin);
答案 2 :(得分:1)
scanf只在读取换行符后才会刷新。它不能以平台无关的方式完成
答案 3 :(得分:0)
你看到两次“Sigues”这一行,因为输入流中还有一个\n
。如果您输入一个字符并按Enter键,则输入流中现在有两个字符。您的scanf
格式化程序只指定一个char,因此scanf
读入一个char然后前进。但是,流中的下一个字符是\n
,因此在第二个字符中退出循环。
NB。 @ eduffy的getc(stdin)
技术会做同样的事情,stdin中仍有\n
。你需要以某种方式超越\n
。
如何读取您的char,然后将流的其余部分扼杀到\n
char?我试过这个,它对我有用:
char op;
do
{
printf("¿Sigues?");
scanf("%c",&op);
while(getchar() != '\n') continue;
}while(op=='s'|| op=='S');