为char类型变量输入多个字符的影响
Effect of entring multiple characters for char type variable
我是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;
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C++字符*缓冲区的大小
- HEX值到wchar_t字符(UTF-8)的转换
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我的字符计数代码计算错误.为什么
- 字符串-C++后显示的随机字符
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 如何在C++中从字符串中分割字符
- 为什么msgrcv()将垃圾字符馈送到缓冲区
- 指向指向字符数组的指针数组的指针
- 如何用转义符替换字符串中的所有特殊字符
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 比较字符数组
- 将字符指针十六进制转换为字符串并保存在文本文件C++中
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 是否有任何区域设置会影响宽字符编码?
- 反向数组,而不会影响特殊字符
- 额外的反斜杠字符不会影响我的程序.为什么
- 使用运算符[]访问一个函数中的字符串会影响C++中另一个函数的输出
- 为char类型变量输入多个字符的影响