gpt4 book ai didi

c - Do while 循环给出意外的输出

转载 作者:行者123 更新时间:2023-11-30 20:24:49 25 4
gpt4 key购买 nike

int main(void)
{ char ch;

for(; ;)
{
do
{ printf("\n Press 'a' for case a ");
printf("\n Press 'b' for case b ");
printf("\n Press 'c' for case c ");

scanf("%c",&ch);
}while(ch!='a' && ch!='b' && ch!='c');

}

return 0;
}

I/p(1):'z' (say) o/p(1):
Press 'a' for case a
Press 'b' for case b
Press 'c' for case c
Press 'a' for case a
Press 'b' for case b
Press 'c' for case c
i/p(2): "NULL(enter)"
o/p(2):Press 'a' for case a
Press 'b' for case b
Press 'c' for case c

请解释这种输出背后的原因

最佳答案

当您输入无效字符“z”时,您的 do..while 循环会运行两次,因为有两个字符需要读取 - 您输入的“z”,以及其后的换行符(按 enter)。

如果您不希望出现这种行为,您可以读取整行并保留第一个字符,而不是读取单个字符,例如在本例中使用 getchar():

do {
int gcres;
printf("\n Press 'a' for case a ");
printf("\n Press 'b' for case b ");
printf("\n Press 'c' for case c ");
ch = getchar();
while ((gcres = getchar()) != '\n' && gcres != EOF);
} while(ch!='a' && ch!='b' && ch!='c');

其中 ch = getchar(); 将第一个字符读取到 ch 中,并且

while ((gcres = getchar()) != '\n' && gcres != EOF);

读取该行中的剩余字符(直到并包括下一个换行符)。 && gcres != EOF 部分仅检查错误/文件结尾,以防止错误或文件结尾出现无限循环。

或者,您也可以在 scanf() 格式字符串中的 %c 之前添加一个空格:

scanf(" %c",&ch);

它将在读取 ch 字符之前跳过任何空格。不过,这仍然会在流中留下以下换行符,因此稍后的读取可能需要处理它。

关于c - Do while 循环给出意外的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32275789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com