以字符串形式存储的数字和以数字形式存储的数字之间是有区别的。
例如,字符串 "2679" 就不是一个数字:它是由 2、6、7、9 这 4 个字符的 ASCII 码组成的序列。由于字符串 "2679" 不是一个数字,所以编译器将不允许对它进行加法、乘法和除法之类的数学运算。以数字表示的字符串必须首先转换为数字形式,然后才能与算术运算符一起使用。
当用户在键盘上输入一个数字时,该数字以字符串的形式输入,就好像用户输入的一系列字符(数字)。在 C++ 中,这样的数字通常通过流提取运算符 >> 来读取。在存储到数字类型的变量之前,该运算符会根据需要自动执行转换。在输出期间,数字到字符串的反向转换由流输出运算符 << 执行。
方法总结都放在如下程序注释中了。
#include<iostream>
#include<typeinfo>
#include<sstream>
#include<string>
using namespace std;
int main(int argc,char **argv)
{
//一、数字字符转数字
/*
1)使用字符串对象istringstream:
istringstream 类是从 istream 派生的。它内部包含一个字符串对象,
函数将它作为可以从中"读取"的输入流。
流提取操作符 >> 从封闭的字符串中读取,并在必要时将字符串转换为数字。
*/
string str1="123";
cout<<str1<<" "<<typeid(str1).name()<<endl;
istringstream istr1(str1);
int i1;
istr1>>i1; //将字符数字转换为数字
cout<<i1<<" "<<typeid(i1).name()<<endl;
/*
2)使用stoX() 系列函数
int stoi(const strings str, size_t* pos = 0, int base = 10)
long stol(const strings str, size_t* pos = 0, int base = 10)
float stof(const strings str, size_t* pos = 0)
double stod(const strings str, size_t* pos = 0)
这些函数可以将 str 可能的最长前缀转换为数字,
并返回一个整数地址pos,pos中保存了str无法被转换的第一个字符的索引。
*/
int i2=stoi(str1);
cout<<i2<<" "<<typeid(i2).name()<<endl;
string str="-342.007 is a double";
size_t pos;//size_t是在标准库中定义的,常用于表示无符号整数的大小或数组、矢量、字符串中的一个索引
double d=stod(str,&pos);
cout<<"The string is:"<<str<<endl;
cout << "The converted double is " << d << endl;
cout << "The stopping character is " << str[pos] << " at position " << pos << endl;
/*
3)单个字符转数字,直接用字符减去'0',也就是减去字符0对应的ascii
适用于一位的字符数字转换
*/
string str2="1";
cout<<str2<<" "<<typeid(str2).name()<<endl;
int i3=str2[0]-'0';
cout<<i3<<" "<<typeid(i3).name()<<endl;
//二、数字转字符
/*
1)使用to_string()函数
*/
int i=234;
string str3=to_string(i); //to_string()C++11标准支持
cout<<str3<<" "<<typeid(str3).name()<<endl;
long j=345;
string str4=to_string(i);
cout<<str4<<" "<<typeid(str4).name()<<endl;
/*
2)一位的数字直接加'0',也就是加0的ascii,可以将该数字直接转换为字符型
*/
string str5;
str5=2+'0';
cout<<str5<<" "<<typeid(str5).name()<<endl;
return 0;
}
程序运行结果
字符数字转数字值在运用字符串解决大数相加减的问题中尤为重要。
参考链接:http://c.biancheng.net/view/1527.html
欢迎点赞!
网友评论