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: