c - do...while 循环有问题
问题描述
所以基本上我正在尝试为输入创建一个简单的缓冲区。
如果用户输入的不是字母“R”或“S”,则 do while 循环会将代码返回到用户输入字母的位置。
但是,例如,当我尝试输入“Z”时,循环会重复两次,要求在第二个循环中输入。
我不明白为什么,请帮助我理解。
我试过......使用while循环?那是行不通的。我不想使用 goto。
<stdio.h>
<stdlib.h>
int main(void)
{
char r_or_s;
printf("Number Reverser/Shuffler v0.1\t");
printf("Written by REN\n");
printf("This program reverses and shuffles the order of numbers.\n\n");
do
{
printf("Would you like to reverse or shuffle numbers? (Press R/S):");
r_or_s = getchar();
printf("\n");
if (r_or_s == 'R')
{
reverseno();
}
else if (r_or_s == 'S')
{
shuffleno();
}
} while (r_or_s != 'R' || r_or_s != 'S');
return 0;
}
预期输出
您想反转或随机排列数字吗?(按 R/S):
拒绝输入后,但实际输出为:
您想反转或随机排列数字吗?(按 R/S):你想倒转或洗牌吗?(按 R/S):
解决方案
发生这种情况是因为您输入了例如“Z”,然后您还按下了 Enter!
那么,你输入了多少个字符呢?二!
然后getchar()
使用标准输入缓冲区中的“Z”,返回从用户处再次读取,但换行符 (Enter) 在标准输入缓冲区中等待。
结果,getchar()
现在使用换行符,导致“循环重复两次”。
您还必须考虑换行符。例如,您可以这样做:
if(r_or_s == '\n')
r_or_s = getchar(); // we read the trailing newline character before, read again
此外,您希望在用户输入“R”或“S”时停止循环,因此您需要更改此:
while (r_or_s != 'R' || r_or_s != 'S');
对此:
while (r_or_s != 'R' && r_or_s != 'S');
推荐阅读
- c# - 用 C# 编写 Neo4J Cypher 查询
- java - 比较两个 json 结构并得到不匹配的变化
- php - 尝试上传非常大的文件时,Laravel 本地主机内存不足
- multithreading - PushSharp 和后台任务
- php - 使用 PHP 从 Mysql 生成 JSON 并自定义它
- php - xml_parse_into_struct() '无内存'错误 PHP
- android - 如何在flutter项目中更改Android minSdkVersion
- python - Python HTTP 总是 301 使用套接字
- php - json_encode 返回充满空值的数组
- html - Django - 如何使您创建的主题公开?学习日志项目