C++ C++;字符到整数
将字母转换为int变量时会发生什么情况?我试着用简单的代码添加两个整数,首先读取它们,然后再添加它们。但当我输入字母时,它就失败了,并在屏幕上打印出大量的数字。但是是什么导致了这个错误呢?我是说,我希望它加载并使用那个字母的ASCII码 如果显式地将字符转换为int,它将使用ASCII码,否则它不会自己转换为int,因此会得到奇怪的结果。可以使用C++ C++;字符到整数,c++,C++,将字母转换为int变量时会发生什么情况?我试着用简单的代码添加两个整数,首先读取它们,然后再添加它们。但当我输入字母时,它就失败了,并在屏幕上打印出大量的数字。但是是什么导致了这个错误呢?我是说,我希望它加载并使用那个字母的ASCII码 如果显式地将字符转换为int,它将使用ASCII码,否则它不会自己转换为int,因此会得到奇怪的结果。可以使用int-istream::get()我假设您有这样的代码: int n; while (someCondition) { std::cin &g
int-istream::get()代码>我假设您有这样的代码:
int n;
while (someCondition) {
std::cin >> n;
.....
std::cout << someOutput;
}
您可以将流恢复到良好状态并丢弃未处理的字符(导致输入失败的输入):
std::cin.clear();
std::cin.ignore(std::numeric_limits::max(),'\n');
另一种可能是接受字符串变量的输入(很少失败),并尝试将字符串转换为int
这是一个非常常见的输入问题,这里和其他地方应该有很多线程。
< P>问题是,当你读到一个整型变量时,使用C++流,输入法期望字符可以组成一个数字,例如‘+’、‘-’、‘0’……9'. 不在此集中的任何字符都会终止输入,并根据这些字符创建一个数字
要获取字符的ASCII值,需要将数据输入到char
变量中。在内部,它具有ASCII值(如果程序不读取16位字符或EBCDIC)。如果要查看ASCII值,则需要将char
变量输出为整数(通常需要在输出前进行强制转换)
如果读取整数失败,程序需要通知用户输入不正确。程序可能要求用户在处理输入数据之前再次输入数字。当您执行以下操作时:
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;
}
这里您正在转换一个数字,并检测转换是否正确strod
仅在查找字符串结尾或空格时停止。为了避免尾随空格欺骗函数,您可能需要一个trim函数:
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;
}
std::string和trim(std::string和str)
{
//删除尾随空格
无符号int pos=str.length()-1;
while(str[pos]=''){
--pos;
}
如果(位置<(结构长度()-1)){
str.erase(pos+1);
}
//删除开头的空格
pos=0;
while(str[pos]=''){
++pos;
}
如果(位置<1){
str.erase(0,pos);
}
返回str;
}
现在您可以安全地从控制台(或任何其他输入流)读取:
intmain()
{
std::字符串条目;
试一试{
std::getline(std::cin,条目);
int age=cnvtToNumber(修剪(输入));
std::你能发布你使用的代码吗?谢谢,如果我没有弄错的话,stdout实际上会向程序发送ASCII代码,但是std::cin会识别它是什么类型并以这种方式使用。如果你希望输入int变量,那么“123”是可以的,但“xyz”是可以的使输入操作失败。流仅从输入中获取一系列字符,但它会执行到您请求的类型的转换,并以您可以而且应该测试的方式指示执行此操作失败。
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;
}
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;
}
}