鱼C论坛

 找回密码
 立即注册
查看: 1384|回复: 3

[已解决]关于cin对char类型多次输入的问题

[复制链接]
发表于 2023-4-7 15:57:21 | 显示全部楼层 |阅读模式
5鱼币
typeIn为char类型,当输入一串字符,这个循环会多次输出 “请以【C】或【F】的形式输入温度单位:” ,如何在保留循环的前提下,避免多次输出?
do {
        std::cout << "请以【C】或【F】的形式输入温度单位: "<<std::endl;
        std::cin >> typeIn;

    } while (
        (typeIn != 'C') && (typeIn != 'c') &&
        (typeIn != 'F') && (typeIn != 'f')
);
ps.该题目为小甲鱼第五节C++快速入门例题
最佳答案
2023-4-7 15:57:22
这个问题的原因在于,当你输入一串字符时,std::cin 会将它们逐个读取并赋值给 typeIn。

你可以通过在读取输入后清空输入缓冲区来避免多次输出。这里有一个改进后的代码示例:
#include <iostream>
#include <limits>

int main() {
    char typeIn;
    do {
        std::cout << "请以【C】或【F】的形式输入温度单位: " << std::endl;
        std::cin >> typeIn;
        
        // 清空输入缓冲区
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    } while (
        (typeIn != 'C') && (typeIn != 'c') &&
        (typeIn != 'F') && (typeIn != 'f')
    );

    // 在此处添加计算温度转换的代码

    return 0;
}
在这个示例中,我们使用 std::cin.clear() 来清除任何错误标志,并使用 std::cin.ignore() 来忽略输入缓冲区中的其余字符,

直到遇到换行符(或达到输入缓冲区的最大限制)。这样一来,循环就不会多次输出提示信息了。

最佳答案

查看完整内容

这个问题的原因在于,当你输入一串字符时,std::cin 会将它们逐个读取并赋值给 typeIn。 你可以通过在读取输入后清空输入缓冲区来避免多次输出。这里有一个改进后的代码示例: 在这个示例中,我们使用 std::cin.clear() 来清除任何错误标志,并使用 std::cin.ignore() 来忽略输入缓冲区中的其余字符, 直到遇到换行符(或达到输入缓冲区的最大限制)。这样一来,循环就不会多次输出提示信息了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-7 15:57:22 | 显示全部楼层    本楼为最佳答案   
这个问题的原因在于,当你输入一串字符时,std::cin 会将它们逐个读取并赋值给 typeIn。

你可以通过在读取输入后清空输入缓冲区来避免多次输出。这里有一个改进后的代码示例:
#include <iostream>
#include <limits>

int main() {
    char typeIn;
    do {
        std::cout << "请以【C】或【F】的形式输入温度单位: " << std::endl;
        std::cin >> typeIn;
        
        // 清空输入缓冲区
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    } while (
        (typeIn != 'C') && (typeIn != 'c') &&
        (typeIn != 'F') && (typeIn != 'f')
    );

    // 在此处添加计算温度转换的代码

    return 0;
}
在这个示例中,我们使用 std::cin.clear() 来清除任何错误标志,并使用 std::cin.ignore() 来忽略输入缓冲区中的其余字符,

直到遇到换行符(或达到输入缓冲区的最大限制)。这样一来,循环就不会多次输出提示信息了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-7 16:40:40 | 显示全部楼层
isdkz 发表于 2023-4-7 16:22
这个问题的原因在于,当你输入一串字符时,std::cin 会将它们逐个读取并赋值给 typeIn。

你可以通过在读 ...

非常感谢,初学者小白受教了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-4-7 16:44:58 | 显示全部楼层
isdkz 发表于 2023-4-7 15:57
这个问题的原因在于,当你输入一串字符时,std::cin 会将它们逐个读取并赋值给 typeIn。

你可以通过在读 ...

我有一个小疑问,引入的limits大致有什么功能,我在VS2022中未引用该头文件可以运行成功
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 15:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表