c++字符串、数组输入输出及相互转化总结


★★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缓存的数据。
    




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值