有人可以告诉我为什么变量的价值' 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标准。
答案 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)
atoi()
期望以空字符结尾的字符串并尝试将整个字符串转换为该数字,因此尝试将其用于单个数字是完全错误的,只需将其应用于整个字符串即可:
int ui = std::atoi( sss.c_str() );