C ++字符为int

时间:2010-03-09 09:09:31

标签: c++

当你cin>>时会发生什么写给int变量?我尝试使用简单的代码添加2个int数字,首先读取它们,然后添加它们。但是当我输入信件时,它就会失败并打印出大量的数字。但是什么导致了这个错误?我的意思是,我希望它加载并使用该字母的ASCII码。

5 个答案:

答案 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))的特定函数。