为char类型变量输入多个字符的影响

Effect of entring multiple characters for char type variable

本文关键字:字符 影响 char 类型变量 输入      更新时间:2023-10-16

我是C++编码的新手。

我注意到,如果我为一个字符变量输入多个字符,那么下面给出的测试程序将进入一个无限循环。我无法正确调试此问题。有人能帮我看看当输入这样的输入时程序的流程如何吗。我怀疑是否会发生一些不安全的转换。

溢出值有可能被作为下一个整数变量的输入,但我在循环中检查变量,并要求用户重新输入值无效。程序不会因为接受新的数字输入而停止。相反,它会无限打印"输入数字"。为什么cin不起作用接受新的输入?这个程序中有什么修改可以纠正这个错误吗?

#include <iostream>
int main()
{
    char name;
    int number=-1;
    cout << "Enter a character: n";
    cin >> name; //Use input like abc here
    cout << "number = " << number;
    while (number == -1)
    {
        cout << "Enter a number: n";
        cin >> number; // This never waits for user input
    }
    return 0;
}

Output
Enter a character:
ytc
number = -1Enter a number:
Enter a number:
Enter a number:

当用户在第一个查询中输入多个字符时,只有第一个字符被提取并存储在name中。

然后,进入循环。读取第一个字符,它不是数字,因此流进入坏状态。所有后续的读取都会失败,因此number的值永远不会改变,并且您有一个无限循环。

以下程序将执行您想要的操作:

#include <iostream>
int main() {
  char name = '';
  int number = -1;
  std::cout << "Enter a character: " << std::endl;
  std::cin >> name;
  std::cout << "You entered " << name << std::endl;
  while(number == -1) {
    std::cout << "Enter a number: " << std::endl;
    if(!(std::cin >> number)) {
      if(std::cin.eof()) {
        std::cout << "User pressed CRTL+d" << std::endl;
        break;
      }
      std::cout << "This was not a valid number - try again: " << std::endl;
      std::cin.clear();
      std::cin.get(); // extract one character
    }
    else
      std::cout << "You entered " << number << std::endl;
  }
}

条件if(!(std::cin >> number))检查提取是否成功。如果没有,则会打印一条错误消息,清除流状态,并提取一个字符。后者是为了防止无限循环,因为如果我们从不提取坏字符,我们将一次又一次地得到相同的错误。

注意,提取std::cin >> number将尝试提取表示数字的最长字符串。如果用户输入234t23432,那么它将提取234,因为t是第一个不能被解释为数字一部分的字符。

没有保证清除输入流的方法。您可以编写代码来清除,但不能保证它会起作用。因为在标准C/C++中,输入流是缓冲的。按键是由操作系统缓冲的,而不是由程序缓冲的。您可以递归地调用cin.get()来确保缓冲区中的所有数据都被消耗掉。请参阅下面的片段

char name = 0;
int number = -1;
std::cout << "Enter a character: " << std::endl;
std::cin >> name;
std::cout << "You entered " << name << std::endl;
// Clear the stream
while( !std::cin.eof() && std::cin.get() != 'n' );
std::cout << "Enter a number: " << std::endl;
std::cin >> number;
return 0;