C++ C++;字符到整数

C++ C++;字符到整数,c++,C++,将字母转换为int变量时会发生什么情况?我试着用简单的代码添加两个整数,首先读取它们,然后再添加它们。但当我输入字母时,它就失败了,并在屏幕上打印出大量的数字。但是是什么导致了这个错误呢?我是说,我希望它加载并使用那个字母的ASCII码 如果显式地将字符转换为int,它将使用ASCII码,否则它不会自己转换为int,因此会得到奇怪的结果。可以使用int-istream::get()我假设您有这样的代码: int n; while (someCondition) { std::cin &g

将字母转换为int变量时会发生什么情况?我试着用简单的代码添加两个整数,首先读取它们,然后再添加它们。但当我输入字母时,它就失败了,并在屏幕上打印出大量的数字。但是是什么导致了这个错误呢?我是说,我希望它加载并使用那个字母的ASCII码

如果显式地将字符转换为int,它将使用ASCII码,否则它不会自己转换为int,因此会得到奇怪的结果。

可以使用
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;
    }
}