c++中char[]与char*的转换以及char*与数字互转
? ? 在c/c++中,字符串操作不可避免,而且通常,char*或者char[]就能表示字符串,這個跟java語言有很大的差別,java中char是字符,string才是字符串,他們是完全不一樣的概念。在c/c++中,雖然string也可以表示字符串,但是char*表示字符串還是更常見。
? ? 既然char*和char[]都可以表示字符串,他們之間的轉換是如何的呢?另外,如果字符串中都是數字,如何將他們轉換為整數或者浮點數,反過來,數字如何轉字符串,這個在日常的編程中,都是必須要掌握的技巧。
? ? 先來總結一下char*與char[]的互轉:
? ? 一般來說,字符串的表示可以是char*,也可以是char[],這里呢,char*字符指針,表示的雖然是一個指針,但是也是一個字符串,它表示一個以'\0'結束的字符串。char[]表示的雖是一個字符數組,但同樣也是一個字符串。
? ? 他們都可以直接賦值:
? ? char* str = "hello";? ?這種表示方法是有問題的,如果在vs編輯器中,它會提示"hello"是一個常量,不可修改,需要const修飾符修飾,所以最終它只能表示為const char* str="hello";
? ? ?
? ? char str1[] = "hello";? ?這種表示法,編譯器會認為它也是一個常量,并且給出了長度char str1[6]。這種表示方式,編譯器不會強制我們在前面加上const修飾符。
? ??
? ? 另外,char[]這種表示方法,我們可以直接在聲明的時候,就給出長度,比如:
char str[6] = "12345";? ? 因為字符數組的最后一位需要用'\0'來填充,表示結束符,所以他的長度總是要在字符實際長度的基礎上+1,這是一個永恒不變的定律。所以,在字符串拷貝的時候,我們經常見到這樣的初始化表達式:??
char* str1 = new char[strlen(str)+1];? ? 而上面的char str[6] = "12345";字符串表示,之所以長度初始化為6,也就是這個原因了。這個長度,只能設置大,最少設置為剛剛好,多數情況下,我們會設置一個偏大的值,比如20、100等,如果我們不想設置,可以留空,讓編譯器自己來默認設置,就是如下的表示方式了:
char str[] = "hello,world.";? ? 這樣,編譯器會默認將數組長度設置為13。?
? ? 那么問題來了,如果我們不注意,把長度設置小了怎么辦??編譯階段就會報錯。
? ??
? ? 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?,就是拷貝賦值,因為無論是char*還是char[],他們都需要先指定一個數組長度進行初始化,然后進行挨個下標拷貝,也就是拷貝賦值。
? ? 其實,都是字符串,為什么這么多講究,還有這么多區別,我也理解的不是很深入,但是通過這些例子,我自己是明白了。
? ? 接下來,我們來看看字符串轉數字的辦法:
? ? 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? ? 如果字符串表示的是整數(int類型),還可以通過atoi()方法。
? ? 反過來,數字轉字符串:
? ? 1、整數可以通過itoa(),c++中需要改為_itoa()
int i = 999; char c[4]; _itoa(i,c,10); cout << "c=" << c << endl;? ? 再次可以看出,char[]數組長度需要指定一個合適的長度。
? ? 2、sprintf(),格式化,和sscanf()類似,這里是將數字轉為字符串。
double num10 = 12.3; char str10[5]; sprintf(str10,"%.1lf",num10); cout << "str10=" << str10 << endl;? ? 這里如果是浮點數轉換為字符串,有個問題,就是浮點數的小數點位數和格式化的參數有很大關系,這里不能一概而論,就是sprintf(str10,"%.1lf",num10),其中"%.1lf"是格式化后一位小數,如果是"%.2lf"就是兩位小數,以此類推。所以這個格式化不是一個標準的辦法。
? ?3、借助sstream的stringstream字符流工具。
double value; stringstream ss; string str; value = 3.1415; ss << value; ss >> str; cout << "str=" << str << endl;? ? ?個人感覺,c/c++對字符串的操作顯然很謹慎,有很多講究,而在java中,這種操作幾乎是無縫對接的。只要他們本身沒有大問題,轉換都封裝好了,Integer.parseInt(str),new String(value)。而在javascript中,這種轉換就更加的直接,parseInt(),parseFloat(),數字轉字符串就更加簡單了,他們直接在數字前面拼接一個""就可以了,比如""+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; }? ? 運行,打印結果如下:
? ? ?
? ? 我們可以確定的是,char如果表示字符串是一個以'\0'結束的字符串,長度是真實長度+1。?
?
總結
以上是生活随笔為你收集整理的c++中char[]与char*的转换以及char*与数字互转的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django教程(自强学堂)
- 下一篇: 两年软件开发工作总结及未来展望