07C++数据类型相互转换.docx

上传人:b****8 文档编号:28478176 上传时间:2023-07-14 格式:DOCX 页数:33 大小:98.31KB
下载 相关 举报
07C++数据类型相互转换.docx_第1页
第1页 / 共33页
07C++数据类型相互转换.docx_第2页
第2页 / 共33页
07C++数据类型相互转换.docx_第3页
第3页 / 共33页
07C++数据类型相互转换.docx_第4页
第4页 / 共33页
07C++数据类型相互转换.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

07C++数据类型相互转换.docx

《07C++数据类型相互转换.docx》由会员分享,可在线阅读,更多相关《07C++数据类型相互转换.docx(33页珍藏版)》请在冰豆网上搜索。

07C++数据类型相互转换.docx

07C++数据类型相互转换

c++中整型和字符数组间的转化

程序目的:

实现c++整型和字符数组,字符串的相互转化

源代码:

#include

#include

usingnamespacestd;

main()

{

    inti1=123,i2,i3;

    floatf1;

    charc1[20]="234.45",c2[20];

    strings1="456",s2;

     i2=atoi(c1);     //作用:

将字符数组转化为整数

    f1=atof(c1);     //作用:

将字符数组转化为浮点型

    itoa(i1,c2,10);//作用:

将整型转化为字符数组 10为10进制的意思

    cout<<"字符数组转化为整型:

"<

    cout<<"字符数组转化为浮点型:

"<

    cout<<"整型转化为字符数组:

"<

//备注:

下面这种做法还挺新鲜的~

    strncpy(c2,s1.c_str(),s1.length());//作用:

字符串转化为字符数组

    i3=atoi(c2);

    cout<<"字符串转化为整型:

"<

    system("pause");

}

截图:

备注:

cstdlib是C++里面的一个常用函数库,等价于C中的

C++中常用的头文件之一。

使用:

#include

该函数主要可以提供一些函数与符号常量,具体如下:

size_t,wchar_t,div_t,ldiv_t,lldiv_t

1、如何将CString变量转换为int变量

2、如何将int变量转换CString为变量

CString ss="1212.12"; 

int temp=atoi(ss); 

CString aa; 

aa.Format("%d",temp); //这在MFC中可以用,一般C++中用不了!

弄了个半天我才发现原来CString类是MFC中的一个类!

一般的C++中不能使用!

那么一般的C++程序(不是MFC程序)中,如何实现字符串和整型,浮点型数据的转换?

3、CString转换为Double

4、Double转换为CString

CString strValue("1.234"); 

double dblValue;  

dblValue = atof((LPCTSTR)strValue); 

C风格字符串,C++string类,MFC,CString类的区别。

字符串,顾名思义是由字符组成的字符串,在标准C,标准C++,MFC中 字符串这一功能的实现是不相同的,C++完全兼容了C。

1. 标准C中的字符串  

在标准C中没有string这样的数据类型,C中的字符串是有char类型的字符数组或者char类型的字符指针来实现的。

例如:

   char name[26]="ThisisaC-stylestring"; 或者

   char *name="ThisisaC-stylestring"; 

  类型的字符串以\0为结束标记,所占内存是实际子符长度+1,其初始化和赋值都要逐个字符的赋值,修改不辨,粒度太小,很不直观,是程序员分散了一些软件的高级层面问题,如算法,抽象数据类型或软件构架。

char *没有构造函数,仅能由指针赋值,而且是一个极其危险的操作,在声明char* 的时候如果没有赋初值,建议先初始化为NULL,以免出现悬浮指针或者指向地址不明的指针,否则,出错会让你很爽!

  标准C中是没有string类型,但是在C中有string.h头文件,需要注意的是此string.h中的string 非彼string,头文件中定义了一些我们经常用到的操作字符串的函数,如复制函数strcpy,连接字符串strcat,比较字符串strcmp,这些函数的操作对象都是指向char*的字符串。

2.标准C++中的string类

  C++支持C风格字符串的使用,而且引入了string类的概念,string为标准模板类STL定义的字符串,几乎可以从所有的字符串构造出来。

string字符串类的都文件是,并且要和using namespacestd; 一起使用。

头文件和头文件没有任何关系,前者是标准C++中的模板库类,后者是标准C中的包含常用C字符串处理函数的头文件,如strcmp,前者并非是后者的升级版。

  要深刻理解标准C++中string是一个类, 如在标准C中定义如下:

char*pt=NULL;这无疑是正确的,但是在标准C++中定义 string *pt=NULL;这样做编译器不会有警告和错误,但是运行是就会有异常。

(备注:

这句话,有待商榷!

)这是因为string作为一个类,定义类的对象时要调用其构造函数的,上面的例子既没有调用其构造函数,还把指针赋值为NULL,很明显就会出错的。

正确的 方法是是new操作符,C++中的new不同于C中的malloc,new不但会分配一块内存,还调用类的构造函数。

string*pt=new("thisisac++-stylestring"); 或者不用指针 string str;系统自动调用默认的构造函数,构造一个string类的对象。

3.MFC中的CString类。

    MFC中的字符串类是CString,封装了string的东西,并增加了一些接口,在功能上完全兼容string类,而一些标准的C/C++不能直接对CString类进行操作,CString类是微软的visualc++提供的MFC里面的一个类,所以只有支持MFC的工程才可以使用。

如在linux上的工程就不能用CString了,只能用标准C++中的string类了。

另外,因为string类是在c++标准库中,所以它被封装在了std命名空间中,使用之前需要声明usingnamespacestd;而CString类并不在std命名空间中,因为它不是c++的标准库,只是微软的一个封装库。

这点看来用string类的程序的移植性更好。

CString和string提供的接口方法不同,对char*的转换也不同。

下面的转换内容来自CSDNBLOG:

4.1CString和string的转换

  Stringstr="ksarea";

CStringcstr(str.c_str());//或者CStringcstr(str.data());一种初始化变量的方法,不用”=”

cstr=str.c_str();或者cstr=str.data();

//备注:

GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间. 

str=cstr.GetBuffer(0); //CString->string

由于format函数的第二个参数要求char*类型,因而要用函数c_str()或者data()

cstr.format("%s", str.c_str()); //string->CString

cstr.format("%s", str.data()); //string->CString

str = LPCSTR(cstr); //CString->string

/*c_str()和data()区别是:

前者返回带'/0'的字符串,后者则返回不带'/0'的字符串*/

《C++标准函数库》中说的 

有三个函数可以将字符串的内容转换为字符数组和C—string 

1、data(),返回没有”\0“的字符串数组 

2、c_str(),返回有”\0“的字符串数组 

3、copy() 

4.2CString和数值类型,如int类型、float类型、double类型的转换

Inti=123;

CStringstr;

str.format("%d",i);//int->CString 其他的基本数值类型如:

float类型等转化类似,仅仅是%f的区别

i=atoi(str);//CString->int 还有(atof,atol)

4.3char*和CString的转换

CStringcstr="ksarea";

//备注:

GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间. 

char* ptemp=cstr.getbuffer(0);

char* str;

strcpy(str,ptemp);//CString->char*

cstr.releasebuffer(-1);

char*str="lovesha";

CStringcstr=str;//char*->CString

string类型不能直接赋值给CString。

至于int与float、string与char*之间的转化可以使用强制转化,或者标准库函数进行。

对于CString与其他类型的转化方法很多,但其实都殊途同归,朝着一个方向即将类型首先转化为char*类型,因为char*是不同类型之间的桥梁。

得到char*类型,转化为其他类型就非常容易了。

这篇文章:

,还不错,主要讲述CString和string的区别,感兴趣的可以去瞅一下。

《〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈〈

下面介绍介个不同数据类型间转化的函数:

(1)atof(将字符串转换成浮点型数)

相关函数  atoi,atol,strtod,strtol,strtoul

 

表头文件  #include 

 

定义函数  double atof(const char *nptr);

 

函数说明  atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。

参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分,如123.456或123e-2。

 

返回值  返回转换后的浮点型数。

 

附加说明  atof()与使用strtod(nptr,(char**)NULL)结果相同。

(2)atoi(将字符串转换成整型数)

相关函数  atof,atol,atrtod,strtol,strtoul

 

表头文件  #include

 

定义函数  int atoi(const char *nptr);

 

函数说明  atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。

 

返回值  返回转换后的整型数。

 

附加说明  atoi()与使用strtol(nptr,(char**)NULL,10);结果相同。

(3)atol(将字符串转换成长整型数)

相关函数  atof,atoi,strtod,strtol,strtoul

 

表头文件  #include

 

定义函数  long atol(const char *nptr);

 

函数说明  atol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。

 

返回值  返回转换后的长整型数。

 

附加说明  atol()与使用strtol(nptr,(char**)NULL,10);结果相同。

(5)strtod(将字符串转换成浮点数)

相关函数  atoi,atol,strtod,strtol,strtoul

 

表头文件  #include

 

定义函数  double strtod(const char *nptr,char **endptr);

 

函数说明  strtod()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,到出现非数字或字符串结束时('\0')才结束转换,并将结果返回。

若endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr传回。

参数nptr字符串可包含正负号、小数点或E(e)来表示指数部分。

如123.456或123e-2。

 

返回值  返回转换后的浮点型数。

 

(6)strtol(将字符串转换成长整型数)

相关函数  atof,atoi,atol,strtod,strtoul

 

表头文件  #include

 

定义函数  long int strtol(const char *nptr,char **endptr,int base);

 

函数说明  strtol()会将参数nptr字符串根据参数base来转换成长整型数。

参数base范围从2至36,或0。

参数base代表采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制等。

当base值为0时则是采用10进制做转换,但遇到如'0x'前置字符则会使用16进制做转换。

一开始strtol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时('\0')结束转换,并将结果返回。

若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回。

 

返回值  返回转换后的长整型数,否则返回ERANGE并将错误代码存入errno中。

 

附加说明  ERANGE指定的转换字符串超出合法范围。

(7)strtoul(将字符串转换成无符号长整型数)

相关函数  atof,atoi,atol,strtod,strtol

 

表头文件  #include

 

定义函数  unsigned long int strtoul(const char *nptr,char **endptr,int base);

 

函数说明  strtoul()会将参数nptr字符串根据参数base来转换成无符号的长整型数。

参数base范围从2至36,或0。

参数base代表采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制数等。

当base值为0时则是采用10进制做转换,但遇到如'0x'前置字符则会使用16进制做转换。

一开始strtoul()会扫描参数nptr字符串,跳过前面的空格字符串,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时('\0')结束转换,并将结果返回。

若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回。

 

返回值  返回转换后的长整型数,否则返回ERANGE并将错误代码存入errno中。

 

附加说明  ERANGE指定的转换字符串超出合法范围。

(8)toascii(将整型数转换成合法的ASCII 码字符)

相关函数  isascii,toupper,tolower

 

表头文件  #include

 

定义函数  int toascii(int c)

 

函数说明  toascii()会将参数c转换成7位的unsigned char值,第八位则会被清除,此字符即会被转成ASCII码字符。

 

返回值  将转换成功的ASCII码字符值返回。

 

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

二、标准C++中将string类型转换为-”数值类型int,float,double类型“主要通过以下几种方式:

(并非MFC程序中!

#方法一:

使用stringstream

stringstream在int或float类型转换为string类型的方法中已经介绍过,这里也能用作将string类型转换为常用的数值类型。

Demo:

1.#include   

2.#include     //使用stringstream需要引入这个头文件  

3.using namespace std;  

4.  

5.//模板函数:

将string类型变量转换为常用的数值类型(此方法具有普遍适用性)  

6.template   

7.Type stringToNum(const string& str)  //注意这里的Type指的是数据类型

8.{  //如:

INT,DOUBLE等,例如下面调用语句!

9.    istringstream iss(str);  //第18行:

stringToNum(str) ,

10.    Type num;  //Type此时指代数据类型int型

11.    iss >> num;  

12.    return num;      

13.}  

14.  

15.int main(int argc, char* argv[])  

16.{  

17.    string str("00801");  

18.    cout << stringToNum(str) << endl;  

19.  

20.    system("pause");  

21.    return 0;  

22.}  

#include

#include//使用stringstream需要引入这个头文件

usingnamespacestd;

//模板函数:

将string类型变量转换为常用的数值类型(此方法具有普遍适用性)

template

TypestringToNum(conststring&str)

{

istringstreamiss(str);

Typenum;

iss>>num;

returnnum;

}

intmain(intargc,char*argv[])

{

stringstr("00801");

cout<(str)<

system("pause");

return0;

}

输出结果:

801

请按任意键继续...

小理解:

方法一中用的是模板函数,表面上看起来似乎不好理解,其实将数据类型从string转化为int、double、float原理很简单!

 stringstream strStream;  //定义一个字符串流对象

strings1=”123”;

strings2=”345.987”;

inta;

floatb;

strStream<

strStream>>a;

strStream.clear();

strStream<

strStream>>b;

 注意:

代码中,我用到了clear()这个函数,这个函数的解释见下一篇文章!

我只能说,这个函数是用来清除流对象的错误标识的,很重要!

#方法二:

使用atoi()、atil()、atof()函数 -----------------实际上是char类型向数值类型的转换

注意:

使用atoi的话,如果strings为空,返回值为0.则无法判断s是0还是空

1.atoi():

    原型:

intatoi(constchar*str);

说明:

ParsestheCstringstrinterpretingitscontentasanintegralnumber,whichisreturnedasanintvalue.

参数:

str:

Cstringbeginningwiththerepresentationofanintegralnumber.

返回值:

1.成功转换显示一个Int类型的值. 2.不可转换的字符串返回0. 3.如果转换后缓冲区溢出,返回INT_MAXorINT_MIN

Demo:

1.#include   

2.using namespace std;  

3.int main ()  

4.{  

5.    int i;  

6.    char szInput [256];  

7.    cout<<"Enter a number:

 "<

8.    fgets ( szInput, 256, stdin );  

9.    i = atoi (szInput);  

10.    cout<<"The value entered is :

"<

11.    cout<<" The number convert is:

"<

12.    return 0;  

13.}  

#include

usingnamespacestd;

intmain()

{

inti;

charszInput[256];

cout<<"Enteranumber:

"<

fgets(szInput,256,stdin);

i=atoi(szInput);

cout<<"Thevalueenteredis:

"<

cout<<"Thenumberconvertis:

"<

return0;

}

输出:

Enteranumber:

48

Thevalueenteredis:

48

Thenumberconvertis:

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1