MzJy 发表于 2023-4-7 17:01:53

cin在输入一串字符时对char类型赋值第一位字符而不选择报错

还是上一个帖子的题,当输入为CCCCCCCCCCCC的时候,程序取第一个C而不报错,是否有可能实现当输入CCCCC或FFFFF时不报错
typeIn为char类型
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')
      );

isdkz 发表于 2023-4-7 17:01:54

MzJy 发表于 2023-4-7 17:10
我其实是想实现当输入为多个字符时,不是只取第一位忽略后面的,而是直接提示重新输入

了解你的需求了。为了实现当输入多个字符时提示重新输入,你可以使用 std::string 类型读取输入,并检查输入字符串的长度。以下是一个修改后的示例:

#include <iostream>
#include <limits>
#include <string>

int main() {
    char typeIn;
    std::string input;

    do {
      std::cout << "请以【C】或【F】的形式输入温度单位: " << std::endl;
      std::getline(std::cin, input);

      // 检查输入字符串的长度是否为 1
      if (input.length() != 1) {
            std::cout << "无效输入,请重新输入一个单一字符。" << std::endl;
            continue;
      }

      typeIn = input;

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

    // 继续你的其他代码

    return 0;
}

在这个版本中,程序使用 std::getline() 读取一整行输入,然后检查输入字符串的长度。

如果长度不为 1,程序将提示用户重新输入一个单一字符。只有当输入字符串长度为 1 且字符为 'C'、'c'、'F' 或 'f' 之一时,循环才会结束。

isdkz 发表于 2023-4-7 17:06:13

你的代码已经可以实现你想要的功能了。当用户输入一串字符(例如 "CCCCCCCCCCCC" 或 "FFFFF")时,std::cin 只会读取并将第一个字符赋值给 typeIn 变量。接下来的 std::cin.clear() 和 std::cin.ignore() 会清除输入缓冲区,从而处理任何额外的字符。

在这个循环中,如果 typeIn 不是 'C'、'c'、'F' 或 'f' 中的任何一个,循环将继续执行。因此,用户必须输入这四个有效字符中的一个,否则程序将继续提示用户输入正确的字符。

所以,在你的代码中,当输入为 "CCCCCCCCCCCC" 时,程序将取第一个 'C' 并继续执行,不会报错。同样,当输入为 "FFFFF" 时,程序将取第一个 'F' 并继续执行,也不会报错。

MzJy 发表于 2023-4-7 17:10:43

isdkz 发表于 2023-4-7 17:06
你的代码已经可以实现你想要的功能了。当用户输入一串字符(例如 "CCCCCCCCCCCC" 或 "FFFFF")时,std::cin ...

我其实是想实现当输入为多个字符时,不是只取第一位忽略后面的,而是直接提示重新输入

MzJy 发表于 2023-4-7 17:21:50

isdkz 发表于 2023-4-7 17:13
了解你的需求了。为了实现当输入多个字符时提示重新输入,你可以使用 std::string 类型读取输入,并检查 ...

懂了,不必纠结那个char,用个string然后判断长度就OK了,非常感谢
页: [1]
查看完整版本: cin在输入一串字符时对char类型赋值第一位字符而不选择报错