★★int,int数组,char,char数组,string,stringstream,之间的相互转化.
注意事项:本文统一使用简单变量名称如下:int i; int ii[]; char c; char cc[]; string s; stringstream ss;
往数组写入数据时保证数组空间足够大。
空白字符包括:空格(ASCii码为32),回车,换行,纵横制表符,进纸符。
★★int输入
//输入以空格或回车区分每个int。
cin>>i1>>i2>>i3;
★★int输出
//可以连续输出
cout<<i1<<' '<<i2<<' '<<i3<<endl;
★★int转char
//输出a,i当作十进制ASCii码看待。
i=97; c=i; cout<<c;
★★int转char数组
//方法一:使用itoa()函数。10表示进制。只能用整数转数组。
itoa(i,cc,10);
//方法二:使用sprintf()函数。i 也可以是浮点数例如 sprintf(cc,%f,f);//其中 f 类型是float
sprintf(cc,%d,i);
// 方法三:通过ss中转。i 也可以是浮点数。如果ss已经被使用过,先用ss.str(""); ss.clear();复位ss。
ss<<i; ss>>cc;
★★int转string
//方法一:先int转char数组,再char数组转string
//方法二(推荐):通过ss中转。i 也可以是浮点数。如果ss已经被使用过,先用ss.str(""); ss.clear();复位ss。
ss<<i; ss>>s;
//其他方法:例如使用boost库中的lexical_cast,就不介绍了。
★★int转stringstream
ss<<i; //如果ss已经被使用过,先用ss.str("");清空ss缓存,再用ss.clear();清除ss无效状态,才能继续串接 i 到ss尾部。
★★int数组输入
//输入以空格或回车区分每个元素
for(int j=0; j<sizeof(ii)/sizeof(ii[0]); ++j) { cin>>ii[ j ]; }
★★int数组输出
for(int j=0; j<sizeof(ii)/sizeof(ii[0]); ++j) { cout<<ii[ j ]<<' '; }
★★int数组转string
//方法一:for(int j=0; j<sizeof(ii)/sizeof(ii[0]); ++j) { 单个元素int转char数组; s+=cc; }
//方法二(推荐):通过ss中转。如果ss已经被使用过,先用ss.str(""); ss.clear();复位ss。
for(int j=0; j<sizeof(ii)/sizeof(ii[0]); ++j) { ss<<ii[ j ]; } s=ss.str();
★★int数组转stringstream
//如果ss已经被使用过,先用ss.str(""); ss.clear();复位ss。
for(int j=0; j<sizeof(ii)/sizeof(ii[0]); ++j) { ss<<ii[ j ]; }
★★char输入
cin>>c;
★★char输出
cout<<c;
★★char转int
//i=c,c自动转换成十进制ASCii码。
c='a'; i=c;
★★char转stringstream
//如果ss已经被使用过,先用ss.str(""); ss.clear();复位ss。
ss<<c;
★★char数组输入
//以回车结束,cc只能接收非空白字符开始的第一个字串,以空格区分。注意第一个字串长度不要超过char数组可容纳字符串长度
cin>>cc;
★★char数组输出。
cout<<cc;
★★char数组转int
//方法一:使用atoi()函数。只能转换整数,开头必须是数字或±,编译器搜索char数组开始后一旦遇到非数字则立刻转换输出结果。
i=atoi(cc);
//方法二:使用sscanf()函数。注意&i ,以及char数组应该是数字字符数组。i 也可以是浮点数。
sscanf(cc,"%d",&i);
//方法三(推荐):通过ss中转。ss>>i;一次流出一个±(+或-)数字子串,子串以空白字符分隔,遇到其他字符或者连续两个±,ss指针失效。如果ss已经被使用过,先用ss.str(""); ss.clear();复位ss。 如果char数组存储一条加式,则非常容易计算结果。例如 char cc="10+10-5"; ss<<cc; ss>>i>>j>>k; int sum=i+j+k;
ss<<cc; ss>>i;
★★char数组转string
s=cc;
★★char数组转stringstream
ss<<a;
★★string输入
//方法一:输入任意长字符串,以回车结束,s只能接收非空白字符开始的第一个字串,以空格区分。
cin>>s;
//方法二:接收回车前输入的所有字符。
getline(cin,s);
★★string输出
cout<<s;
★★string转int
//方法一:先转为char数组,char数组再转为int
//方法二(推荐):通过ss中转ss>>i;一次流出一个±(+或-)数字子串,子串以空白字符分隔,遇到其他字符或者连续两个±,ss指针失效。如果ss已经被使用过,先用ss.str(""); ss.clear();复位ss。
ss<<s; ss>>i;
//其他方法:例如使用strtol(string to long) ,使用boost库中的lexical_cast,就不介绍了。
★★string转char数组
strcpy(cc,s.c_str());
★★string转stringstream
ss<<s;
★★stringstream输入
//只能通过其他方式中转。
getline(cin,s); ss<<s;
★★stringstream输出
cout<<ss.str();
★★stringstream转int
//一个整数字符串作为一个整数赋给i,以空白字符区分。如果此次输出的ss为最后一段数据(),则输出后ss读写指针都失效
ss>>i;
★★stringstream转int数组
//一个整数字符串作为一个整数赋给ii的一个元素,以空白字符区分,ss中所有数据流出完,则ss>>ii[j]变false。
int j=0; while(ss>>ii[j]) ++j;
★★stringstream转char
ss>>c;
★★stringstream转char数组
//只能接收非空白字符开始的一个字串。如果ss已经被使用过,并且不知道在哪被使用,则先用ss.str(""); ss.clear();复位ss。
//如果ss给cc连续赋值
ss>>cc;
★★stringstream转string
//一次只流出一个字符串,以空白字符区分
ss>>s;
//把ss中所有数据表示成一个字符串形式赋给s
s=ss.str();
★★stringstream使用注意事项
//ss可以存储endl和'\n',endl!='\n' 。 顺便提一下,s和cc可以存储'\n'
ss<<endl;
//直接cout<<ss;输出的是ss的地址值。
//ss.str();得到的是ss缓存的所有数据组成的一个字符串,当然包括空白字符。
//如果这样赋值,ss<<"abc\0 def"; 则空白符\0后的数据未流入ss。
//可以这样赋值:ss.str(cc); ss.str(s); ss.str("abc");
//一旦ss流出最后一段有效数据,流入流出指针都失效,一旦俩指针都失效,进行ss<<或ss>>操作都返回false,可据此判断ss的数据是否输出完成。
//这里约定ss<<叫流入,ss>>叫流出。
//ss的流入指针和流出指针是相互独立的,如果流出的是ss中最后一段有效数据,则流出之后ss读写指针都失效(但如果最后一个字符是空白字符,则指针仍有效),但ss缓冲区的数据还在,要想接着流入,需要先使用ss.clear();清除指针异常,如果不想保留数据,可以使用ss.str(""); ss.clear();复位ss。例如:
ss<<4; ss>>i; ss<<5; //5流入ss失败。
ss<<4; ss>>i; ss>>j; //ss流出j失败。
ss<<4; ss>>i; ss.clear(); ss<<5; ss>>j; //5流入ss成功,同样ss流出j成功。
ss<<"abc"; ss>>s; ss<<"cba"; //cba流入ss失败,因为ss>>s流出的是最后一段有效数据。
ss<<"abc "; ss>>s; ss<<"cba"; //cba流入ss成功,因为"abc "后有个空格。
ss<<"abc\n"; ss>>s; ss<<"cba"; //cba流入ss成功,因为"abc "后有个回车符。
ss<<"abc"; ss>>s; cout<<ss.str(); //cout输出abc,即使ss>>s是ss的流入流出指针失效,也不影响使用ss.str()访问ss缓存的数据。