C/C++中类型转换

C/C++中经常会使用到基本数据类型与字符串(char*)类型的相互转换,我在这里总结一下我学到的几种转换方法,欢迎补充和纠错。


一. 从其他基本数据类型到字符串


方法(1): 使用stdio.h库中的snprintf函数, 将格式化字符串写到char数组                            

原型:

int snprintf ( char * s, size_t n, const char * format, ... );

参数:

    s : 目标字符数组

    n: 最大可以写到s中的字符数(包含结尾'\0'字符)

    format: 格式化字符串

 返回值:

            成功时返回写到字符数组中的字符数(结尾的'\0'字符不算在里面),失败时返回负数


示例代码

    char s[1000];

    int n = snprintf(s, 1000,"%f %d %s", 0.33, 22, "hello");

    printf("written char number: %d\nresult string: %s\n", n, s);

    return 0;


优点:简单直接

缺点:溢出时会发生截断,而且还必须使用正确的格式化字符串,否则会导致不可预知的结果。


方法二(2)使用<sstream>库的stringstream 或ostringstream对象


a. stringstream对象可用于输入和输出流

b. ostringstream对象只用于输出流


ostringstream示例代码:

    ostringstream ostream;
    ostream<<22<<" "<<0.33;
    cout<<ostream.str()<<endl

stringstream示例代码:

    stringstream stream;
    stream<<22<<" "<<0.33;
    cout<<stream.str()<<endl;

注意: str是stream对象的成员方法,它有以下两个原型:

string str() const;
void str (const string& s);
第一个原型,是返回当前流内容的字符串。

第二个原型会先清空当前流的内容,然后将s设置为当前流内容。


优点:由编译器进行类型安全检查,简单又安全

缺点:stream对象的构造和析构耗费时间,但是可以通过使用clear后对stream对象进行复用来提高效率。



二. 从字符串到其他基本数据类型

方法(1):使用<stdio.h>的sscanf函数,从给定字符串格式化读入数据

<strong> </strong>   int a;
    double b;
    char s[1000];
    sscanf("12 33.33 hello", "%d%lf%s", &a, &b, &s);
    cout<<a<<" "<<b<<" "<<s<<endl;

优点:简单直接。
缺点:必须使用正确的格式化字符串,否则会导致不可预知的结果。


方法(2): 使用<sstream>库的stringstream 或istringstream对象

a. stringstream对象可用于输入和输出流

b. istringstream对象只用于输入流


stringstream示例代码:

    int a;
    double b;
    char s[1000];
    stringstream stream("22 0.33 hello");
    //or stream.str("22 0.33 hello");
    stream>>a>>b>>s;
    cout<<a<<" "<<b<<" "<<s<<endl;

istringstream示例代码:

    int a;
    double b;
    char s[1000];
    istringstream istream("22 0.33 hello");
    //or stream.str("22 0.33 hello");
    istream>>a>>b>>s;
    cout<<a<<" "<<b<<" "<<s<<endl;



注意:
(1)转换时,每个对象都以空格或tab或换行符作为分割符。

(2)若要复用stringstream对象(每遇到一次作为输入流然后紧接着再作为输出流,那就是不同的两次), 在这之间要调用clear成员函数。


方法(3):使用<stdlib.h>库中的atoi、atol、strtod、strtof、strtol等,其中str开头的函数还支持进制转换,还支持从任意字符串转换(也就是说字符串不一定是纯数字的)。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值