前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++学习总结4——类型转换

C++学习总结4——类型转换

作者头像
王云峰
发布2019-12-25 16:06:25
8110
发布2019-12-25 16:06:25
举报

在写程序的时候有时会遇到类型转换的问题,而这些问题的解答每次都记不住,每次都得上网查找,经常下来,也觉得很浪费时间。所以这里我把C语言和C++里面一些常用的类型转换方式写下来,一方面为了以后查找方便,另一方面也是希望通过敲一遍能尽可能地记住转换的思路。所有这些转换的代码我已经放到了github上,或许可以帮到你。

几种字符串之间的转换

字符串类型介绍

这里说的“字符串”包括string,’wstring’,’CString’。string是C++里面默认的字符串表示形式,string的实现使用了容器的概念,所以string类对象也有begin()end()这些迭代方法。’wstring’ 是保存宽字符(wide character,C++中有wchar_t类型来表示宽字符)的字符串。字符串常量在初始化’wstring’类型对象时,前面要加“L”,用以表明是宽字符串。’CString’是Windows平台下的特定的字符串,在MFC程序中使用广泛,但也可以在非MFC程序中使用,只要包括相应的头文件即可:’CString’在afx.h中定义,所以只需在程序中include <afx.h>就可以使用’CString’啦。

代码语言:javascript
复制

#include <iostream>
#include<string>

#define _AFXDLL _AFXDLL_H_ //注意:必须写在afx.h之前

#include <afx.h>

using namespace std;

int main()
{
    string str_exampe = “This is oridnary string”;

    //注意:字符串常量前面要加L
    wstring wstr_exampe = L”This is wide string”;

    CString cstr_example = “This is Cstring”;

    return 0;
}

要强调的是,_AFXDLL的定义必须写在#include<afx.h>之前,否则会出现_AFXDLL未定义的错误。

转换代码

CString 可以用来表示所有字符,根据字符编码的不同,可以表示宽字符或者非宽字符。Windows使用了LPCTSTR来表示你的字符是否使用了UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。贴代码:

代码语言:javascript
复制

#include <iostream>
#include<string>

#define _AFXDLL XXX //注意:必须写在afx.h之前

#include <afx.h>

using namespace std;

int main()
{

    //1-1.string to wstring
    string name = “Aldex”;
    wstring w_name(name.begin(), name.end());

    //1-2\. wstring to string
    wstring w_name2 =L”Smitch Hill”;
    string name2(w_name2.begin(), w_name2.end());
    cout << name2 << endl;

    //2-1.string to CString
    string name3 = “Cook Book”;
    CString c_name3(name3.c_str());
    cout << c_name3 << endl;

    //2-2.CString to string
    CString c_name4 = “Malon Balendo”;
    string name4 = (LPCTSTR)c_name4;
    cout << name4 << endl;

    //3-1.wstring to CString
    wstring w_name5 = L”Odlely Herben”;
    CString c_name5 = w_name5.c_str();
    cout << c_name5 << endl;

    //3-2.Cstring to wstring
    CString c_name6 = “Jephp Phoo”;

    //in ANSI build
    wstring w_name6 =CStringW(c_name6);
    //in Unicode build
    wstring w_name6 = c_name6;

    return 0;
}

需要强调的是,从CString转换到wstring时,需要根据当前项目的编码方式来决定该用哪种转换方法(我在VS里面试了一下,默认是ANSI 环境)。

字符数组和字符串之间的转换

const char* 和char*之间转换(const wchar_t* 与 wchar_t* 类似)

由于指针和数组相似的性质,下面统一用指针来陈述。

const char* 是常字符数组,相比char*,其内容是不可变的,所以从char*const char*是“从宽到窄”,正常可以进行,甚至不需要类型转换;而从const char*char*则是“从窄到宽”,转换被认为是不正常的,所以如果需要这样的转换,请先考虑程序设计是否有问题。当然,转换方式还是有的:可以用strdup 或者_strdup函数。

代码语言:javascript
复制

#include <iostream>
#include<string>

using namespace std;
int main()
{

    //1-1.char* to const char*
    char* arr_name =“Hello, Blub Bulb “;
    const char* c_arr_name = arr_name;
    printf(“%s”, c_arr_name);

    //1-2.const char* to char
    const char* c_arr_name2 = “Android Lollipop”;

    char* arr_name2 = _strdup(c_arr_name2); //ISO C++ onformant name
    char* arr_name2 = strdup(c_arr_name2); //The Posix name

    printf(“%s”, arr_name2);

    return 0;
}

char*和wchar_t*之间的转换

char*wchar_t*之间的转换我很少用到,这里还是从网上找了出来,列举如下:

代码语言:javascript
复制
#include <iostream>
#include <string>

using namespace std;

int main()
{

    //2-1.char* to wchar_t*
    char* arr_name = “Hulu Gulu”;
    size_t size = strlen(arr_name) + 1;
    wchar_t* w_arr_name = new wchar_t[size];
    mbstowcs(w_arr_name, arr_name, size);

    //2-2\. wchar_t* to char*
    wchar_t* w_arr_name2 = L”Big Ben”;
    char* arr_name2 = new char[wcslen(w_arr_name2)]; // wcslen用来求宽体字符数组的长度
    wcstombs(arr_name2, w_arr_name2, wcslen(w_arr_name2));

    return 0;
}

char* 和 string的转换(wchar_t* 和 wstring转换同理)

char* 转化为string时会进行默认类型转换,即不需要显式地转换。而string转换为const char* 比较容易,要转换为char*比较麻烦,要进行内存的复制,如下:

代码语言:javascript
复制

#include <iostream>
#include<string>

using namespace std;
int main()
{

    //3-1.char* to string
    char* arr_name = “This is my name”;
    string name(arr_name);
    cout << arr_name;

    //3-2.string to char*
    string name2 = “Hoop Hope”;

    //转换为const char* 类型
    const char* c_arr_name2 = name2.c_str();   

    //转换为char*类型
    char* arr_name2 = new char[name2.length() + 1];
    strcpy(arr_name2, name2.c_str());

    return 0;
}

wchar_t*和string,char* 和wstring之间的转换

这一类的转换我没遇到过,但我想利用前面的这些转换方法,通过使用一个中间格式,可以完成转换,所以就再没有查这部分的转换。

字符串和别的数据类型之间的转换

这部分总结下字符串类型和int,float这些类型转换时的一些方法。

char* 和int,float类型转换

这方面有三种选择:atoi(对float类型是atof), sscanfstrtol(对float类型,是strtof)。StackOverFlow上的这个回答详细的解释了三者的区别,总体来说atoi速度最快,但出错时没有提示,sscanf可以通过类似scanf的方式来读取,strtol最安全,错误提示也多,但默认是将char* 转换为long int(函数名的含义:str to long)。三种代码如下:

代码语言:javascript
复制
#include <iostream>
#include<string>
using namespace std;

int main()
{
     //1-1.char* to int
     char* arr_number = “2015”;

     //a.use atoi
     int number1 = atoi(arr_number);
     cout << number1<< endl;

     //b.use sscanf
     int number2;
     sscanf(arr_number, “%d”, &number2);
     cout << number2 << endl;

     //c.use strtol
     char* pEnd; //用以指向末尾位置

     int number3 = strtol(arr_number, &pEnd, 0);//最后一个参数表示从char*的第几个位置开始读取

     //1-2.int to char*

     int time = 2345;

     //a.use itoa
     char* arr_time;
     itoa(time, arr_time, 0);//最后一个参数表示从int的第几个位置开始读取

     //b.use sprintf
     char* arr_time2;
     sprintf(arr_time2, “%d”, time);

     return 0;
}

string 和int,float类型之间的转换

stringintfloat之间的转换要用到 stringstream,或者ostringstreamistringstream

区别是stringstream既可以传入,也可以传出,所以既可以将string转化为intfloat,也可以将intfloat转换为string;而ostringstream只能输出string,所以只能将intfloat转换为stringistringstream刚好反过来了。

总的来说stringstream是双向的,而i/ostringstream是单向的。相应地,wstringint/float 可以通过wstring或者wostringstreamwistringstream来转换。

注意需要包含sstream头文件。

代码语言:javascript
复制
#include <iostream>
#include<sstream>
#include<string>

using namespace std;

int main()
{

     //2-1.string to int
     string str_age = “73”;

     //a.use stringstream
     stringstream s(str_age);
     int age;
     s >> age;
     cout << age << endl;

     //b.use istringstream
     istringstream is(str_age);

     int age2;
     is >> age2;
     cout << age2 << endl;

     //2-2.int to string

     //a.use stringstream
     int year = 2015;
     stringstream s2;
     s2 << year;
     string str_year;
     s2 >> str_year;
     cout << str_year << endl;

     //b.use ostringstream
     ostringstream os;
     os << year;
     string str_year2 = os.str();
     cout << str_year2 << endl;

     return 0;
}

参考内容

基本都是StackOverFlow的链接……

1.http://stackoverflow.com/questions/2573834/c-convert-string-or-char-to-wstring-or-wchar-t

2.http://stackoverflow.com/questions/4804298/how-to-convert-wstring-into-string

3.http://stackoverflow.com/questions/15333259/c-stdwstring-to-stdstring-quick-and-dirty-conversion-for-use-as-key-in

4.http://stackoverflow.com/questions/11821491/converting-string-to-cstring-in-c

5.http://stackoverflow.com/questions/2041241/convert-cstring-to-stdwstring

6.http://stackoverflow.com/questions/258050/how-to-convert-cstring-and-stdstring-stdwstring-to-each-other

7.http://stackoverflow.com/questions/6117270/mfc-stdstring-vs-cstring

8.http://stackoverflow.com/questions/2041241/convert-cstring-to-stdwstring

9.http://stackoverflow.com/questions/2259544/is-wchar-t-needed-for-unicode-support

10.http://baike.baidu.com/view/998109.htm

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015-03-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 几种字符串之间的转换
    • 字符串类型介绍
      • 转换代码
      • 字符数组和字符串之间的转换
        • const char* 和char*之间转换(const wchar_t* 与 wchar_t* 类似)
          • char*和wchar_t*之间的转换
            • char* 和 string的转换(wchar_t* 和 wstring转换同理)
              • wchar_t*和string,char* 和wstring之间的转换
              • 字符串和别的数据类型之间的转换
                • char* 和int,float类型转换
                  • string 和int,float类型之间的转换
                  • 参考内容
                  相关产品与服务
                  容器服务
                  腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档