atoi没有给出正确的输出

时间:2018-01-17 17:25:34

标签: c++

有人可以告诉我为什么变量的价值' b'是25,我期待值为2.这是我的代码

#include<iostream>
#include<string>
#include<stdlib.h>
#include<sstream>

using namespace std;

int main(int argc,char*argv[])
{
    stringstream ss;
    string sss;
    unsigned short rt=52;
    ss<<rt;
    sss=ss.str();

    cout<<sss.at(0)<<"     "<<sss.at(1)<<endl;
    char ch1=sss.at(0);
    char ch2=sss.at(1);
    //int ui=atoi((char*)sss.at(0))*10+atoi((char*)sss.at(1)); //can somebody tell me what's wrong in this statement(causes segmentation fault)
    cout<<ch1<<"     "<<ch2<<endl;
    int a=atoi(&ch1);
    int b=atoi(&ch2); //giving output as 25
    cout<<a<<"    "<<b<<endl;
    int c=a*10+b;
    int ui=atoi(&ch1)*10+atoi(&ch2);

    cout<<ui<<"     "<<c<<endl;
}

请注意我的编译器不支持C ++ 11标准。

2 个答案:

答案 0 :(得分:2)

atoi应该使用以零结尾的C字符串作为输入参数 并且你只传递指向角色的指针。这是未定义的行为,可能有任何结果(在某些情况下程序可能崩溃)

但为什么你真的得到25?

可能两个变量ch1和ch2都按顺序存储在内存中,并且后面有一些非数字字符。 atoi()将指向ch1的指针视为以零结尾的c-string,并从内存中读取数据,直到找到第一个非数字字符,然后将结果转换为整数。这就是为什么你得到25.但实际上它是未定义的行为,你可能会得到另一个结果或程序崩溃与另一个编译器(或甚至另一个编译参数)。

我还可以在注释掉的代码行中看到另外一个问题

//int ui=atoi((char*)sss.at(0))*10+atoi((char*)sss.at(1)); //can somebody tell me what's wrong in this statement(causes segmentation fault)

存在分段错误,因为您将char(&#39; 2&#39;或&#39; 5&#39;)的值转换为指针&#34; char *&#34;。所以这些字符的ASCII码被视为内存地址。当然这个地址不正确,访问内存会导致分段错误。

答案 1 :(得分:2)

documentation中所述的

atoi()期望以空字符结尾的字符串并尝试将整个字符串转换为该数字,因此尝试将其用于单个数字是完全错误的,只需将其应用于整个字符串即可:

int ui = std::atoi( sss.c_str() );