当你cin>>时会发生什么写给int变量?我尝试使用简单的代码添加2个int数字,首先读取它们,然后添加它们。但是当我输入信件时,它就会失败并打印出大量的数字。但是什么导致了这个错误?我的意思是,我希望它加载并使用该字母的ASCII码。
答案 0 :(得分:10)
我假设你有这样的代码:
int n;
while (someCondition) {
std::cin >> n;
.....
std::cout << someOutput;
}
当您输入无法读取为整数的内容时,只要您不处理输入错误,流(std :: cin)就会进入失败状态并且所有后续输入尝试都会失败。
您可以测试输入操作是否成功:
if (!(std::cin >> n)) //failed to read int
您可以将流恢复到良好状态并丢弃未处理的字符(导致输入失败的输入):
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
另一种可能性是接受输入到字符串变量(很少失败)并尝试将字符串转换为int。
这是一个非常常见的输入问题,在这里和其他地方应该有很多关于它的线程。
答案 1 :(得分:3)
如果你明确地将你的char转换为int,它将使用ASCII代码,否则它不会自己执行转换为int,所以你会得到你得到的奇怪结果。
答案 2 :(得分:1)
您可以使用int istream::get();
答案 3 :(得分:1)
问题在于,当您使用C ++流读入整数变量时,输入方法需要可以组成数字的字符,例如“+”,“ - ”,“0”......“9” 。任何不在此集合中的字符都会终止输入,并从这些字符创建一个数字。
要获取字符的ASCII值,您需要将数据输入char
变量。在内部,它具有ASCII值(假设程序不读取16位字符或EBCDIC)。如果要查看ASCII值,则需要将char
变量作为整数输出(通常需要在输出之前进行转换)。
如果读取整数失败,则程序需要通知用户输入不正确。程序可能要求用户在程序处理输入数据之前再次输入数字。
答案 4 :(得分:1)
当您执行以下操作时:
int x;
cin >> x;
您正在指示C ++期望从键盘读取int
。实际上,当您输入的内容不是int
时,输入流(在这种情况下为标准输入)由于其错误状态而无法使用。
这就是为什么我个人更喜欢总是读取字符串,并在需要时将它们转换为数字。 C ++标准库的C部分中有转换函数可以帮助解决这个问题。
double cnvtToNumber(const std::string &num)
{
char * ptr;
double toret = strtod( num.c_str(), &ptr );
if ( *ptr != 0 ) { // If it got to the end of the string, then it is correct.
throw std::runtime_error( "input was not a number" );
}
return toret;
}
在这里,您要转换一个数字,并检测转换是否正确。 strtod(s)
只会在找到字符串末尾或空格时停止。为了避免欺骗函数的尾随空格,您可能需要一个修剪函数:
std::string &trim(std::string &str)
{
// Remove trailing spaces
unsigned int pos = str.length() -1;
while( str[ pos ] == ' ' ) {
--pos;
}
if ( pos < ( str.length() -1 ) ) {
str.erase( pos + 1 );
}
// Remove spaces at the beginning
pos = 0;
while( str[ pos ] == ' ' ) {
++pos;
}
if ( pos < 1 ) {
str.erase( 0, pos );
}
return str;
}
现在您可以安全地从控制台(或任何其他输入流)读取:
int main()
{
std::string entry;
try {
std::getline( std::cin, entry );
int age = cnvtToNumber( trim( entry ) );
std::cout << age << std::endl;
} catch(const std::exception &e) {
std::cerr << e.what() << std::endl;
}
}
如果你总是阅读double
然后转换它们,你当然会失去精确度。如果您想进一步调查,则有整数(strtol(s)
)的特定函数。