c++中char[]与char*的转换以及char*与数字互转
? ? 在c/c++中,字符串操作不可避免,而且通常,char*或者char[]就能表示字符串,這個(gè)跟java語言有很大的差別,java中char是字符,string才是字符串,他們是完全不一樣的概念。在c/c++中,雖然string也可以表示字符串,但是char*表示字符串還是更常見。
? ? 既然char*和char[]都可以表示字符串,他們之間的轉(zhuǎn)換是如何的呢?另外,如果字符串中都是數(shù)字,如何將他們轉(zhuǎn)換為整數(shù)或者浮點(diǎn)數(shù),反過來,數(shù)字如何轉(zhuǎn)字符串,這個(gè)在日常的編程中,都是必須要掌握的技巧。
? ? 先來總結(jié)一下char*與char[]的互轉(zhuǎn):
? ? 一般來說,字符串的表示可以是char*,也可以是char[],這里呢,char*字符指針,表示的雖然是一個(gè)指針,但是也是一個(gè)字符串,它表示一個(gè)以'\0'結(jié)束的字符串。char[]表示的雖是一個(gè)字符數(shù)組,但同樣也是一個(gè)字符串。
? ? 他們都可以直接賦值:
? ? char* str = "hello";? ?這種表示方法是有問題的,如果在vs編輯器中,它會(huì)提示"hello"是一個(gè)常量,不可修改,需要const修飾符修飾,所以最終它只能表示為const char* str="hello";
? ? ?
? ? char str1[] = "hello";? ?這種表示法,編譯器會(huì)認(rèn)為它也是一個(gè)常量,并且給出了長(zhǎng)度char str1[6]。這種表示方式,編譯器不會(huì)強(qiáng)制我們?cè)谇懊婕由蟘onst修飾符。
? ??
? ? 另外,char[]這種表示方法,我們可以直接在聲明的時(shí)候,就給出長(zhǎng)度,比如:
char str[6] = "12345";? ? 因?yàn)樽址麛?shù)組的最后一位需要用'\0'來填充,表示結(jié)束符,所以他的長(zhǎng)度總是要在字符實(shí)際長(zhǎng)度的基礎(chǔ)上+1,這是一個(gè)永恒不變的定律。所以,在字符串拷貝的時(shí)候,我們經(jīng)常見到這樣的初始化表達(dá)式:??
char* str1 = new char[strlen(str)+1];? ? 而上面的char str[6] = "12345";字符串表示,之所以長(zhǎng)度初始化為6,也就是這個(gè)原因了。這個(gè)長(zhǎng)度,只能設(shè)置大,最少設(shè)置為剛剛好,多數(shù)情況下,我們會(huì)設(shè)置一個(gè)偏大的值,比如20、100等,如果我們不想設(shè)置,可以留空,讓編譯器自己來默認(rèn)設(shè)置,就是如下的表示方式了:
char str[] = "hello,world.";? ? 這樣,編譯器會(huì)默認(rèn)將數(shù)組長(zhǎng)度設(shè)置為13。?
? ? 那么問題來了,如果我們不注意,把長(zhǎng)度設(shè)置小了怎么辦??編譯階段就會(huì)報(bào)錯(cuò)。
? ??
? ? 1、? char[]? -> char*? ? :通過"="直接賦值
char str1[] = "hello"; char* str2 = str1; cout<<"str1="<<str1<<"\nstr2="<<str2<<endl;?? ? 2.1、char* -> char*? ?:借助strcpy()拷貝賦值
const char* str3 = "1234"; char* str4 = new char[strlen(str3)+1]; strcpy(str4,str3); cout<<"str3="<<str3<<"\nstr4="<<str4<<endl;? ? 2.2、char* -> char[]? ? ?:借助strcpy()拷貝賦值?
const char* str5 = "helloworld"; char str6[11]; strcpy(str6,str5); cout<<"str5="<<str5<<"\nstr6="<<str6<<endl;? ? 通過上面的示例,我們知道,如果是char[]->char*,就是直接賦值,如果是char*->char?,就是拷貝賦值,因?yàn)闊o論是char*還是char[],他們都需要先指定一個(gè)數(shù)組長(zhǎng)度進(jìn)行初始化,然后進(jìn)行挨個(gè)下標(biāo)拷貝,也就是拷貝賦值。
? ? 其實(shí),都是字符串,為什么這么多講究,還有這么多區(qū)別,我也理解的不是很深入,但是通過這些例子,我自己是明白了。
? ? 接下來,我們來看看字符串轉(zhuǎn)數(shù)字的辦法:
? ? 1、sscanf()??
//sscanf char str7[] = "3.1415"; double num7; sscanf(str7,"%lf",&num7); cout<<"num7="<<num7<<endl; // 3.1415? ? 2、strtod()
char str9[] = "24.876543E+001"; double num9; num9 = strtod(str9,NULL); cout<<"num9="<<num9<<endl; // 248.765? ? 3、atof()
//atof char str8[] = "15.6"; double num8; num8 = atof(str8); cout<<"num8="<<num8<<endl; // 15.6? ? 如果字符串表示的是整數(shù)(int類型),還可以通過atoi()方法。
? ? 反過來,數(shù)字轉(zhuǎn)字符串:
? ? 1、整數(shù)可以通過itoa(),c++中需要改為_itoa()
int i = 999; char c[4]; _itoa(i,c,10); cout << "c=" << c << endl;? ? 再次可以看出,char[]數(shù)組長(zhǎng)度需要指定一個(gè)合適的長(zhǎng)度。
? ? 2、sprintf(),格式化,和sscanf()類似,這里是將數(shù)字轉(zhuǎn)為字符串。
double num10 = 12.3; char str10[5]; sprintf(str10,"%.1lf",num10); cout << "str10=" << str10 << endl;? ? 這里如果是浮點(diǎn)數(shù)轉(zhuǎn)換為字符串,有個(gè)問題,就是浮點(diǎn)數(shù)的小數(shù)點(diǎn)位數(shù)和格式化的參數(shù)有很大關(guān)系,這里不能一概而論,就是sprintf(str10,"%.1lf",num10),其中"%.1lf"是格式化后一位小數(shù),如果是"%.2lf"就是兩位小數(shù),以此類推。所以這個(gè)格式化不是一個(gè)標(biāo)準(zhǔn)的辦法。
? ?3、借助sstream的stringstream字符流工具。
double value; stringstream ss; string str; value = 3.1415; ss << value; ss >> str; cout << "str=" << str << endl;? ? ?個(gè)人感覺,c/c++對(duì)字符串的操作顯然很謹(jǐn)慎,有很多講究,而在java中,這種操作幾乎是無縫對(duì)接的。只要他們本身沒有大問題,轉(zhuǎn)換都封裝好了,Integer.parseInt(str),new String(value)。而在javascript中,這種轉(zhuǎn)換就更加的直接,parseInt(),parseFloat(),數(shù)字轉(zhuǎn)字符串就更加簡(jiǎn)單了,他們直接在數(shù)字前面拼接一個(gè)""就可以了,比如""+123。
? ? 以上完整代碼如下所示:
#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE) #define _CRT_SECURE_NO_DEPRECATE #endif #include <iostream> #include <string> #include <sstream> using namespace std; int main() {//=char str1[] = "hello";char* str2 = str1;cout << "str1=" << str1 << "\nstr2=" << str2 << endl;//strcpyconst char* str3 = "1234";char* str4 = new char[strlen(str3) + 1];strcpy(str4, str3);cout << "str3=" << str3 << "\nstr4=" << str4 << endl;//strcpyconst char* str5 = "helloworld";char str6[11];strcpy(str6, str5);cout << "str5=" << str5 << "\nstr6=" << str6 << endl;//sscanfchar str7[] = "3.1415";double num7;sscanf(str7, "%lf", &num7);cout << "num7=" << num7 << endl;//atofchar str8[] = "15.6";double num8;num8 = atof(str8);cout << "num8=" << num8 << endl;//strtodchar str9[] = "24.876543E+001";double num9;num9 = strtod(str9, NULL);cout << "num9=" << num9 << endl;//sprintfdouble num10 = 12.3;char str10[5];sprintf(str10,"%.1lf",num10);cout << "str10=" << str10 << endl;//ecvt/*char* str11;int dec, sign;int dig = 10;double num11 = 9.86;str11 = _ecvt(num11, dig, &dec, &sign);cout << "str11=" << str11 << endl;*/double value;stringstream ss;string str;value = 3.1415;ss << value;ss >> str;cout << "str=" << str << endl;return 0; }? ? 運(yùn)行,打印結(jié)果如下:
? ? ?
? ? 我們可以確定的是,char如果表示字符串是一個(gè)以'\0'結(jié)束的字符串,長(zhǎng)度是真實(shí)長(zhǎng)度+1。?
?
總結(jié)
以上是生活随笔為你收集整理的c++中char[]与char*的转换以及char*与数字互转的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django教程(自强学堂)
- 下一篇: C++中单独大括号的意义