日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++中char[]与char*的转换以及char*与数字互转

發布時間:2023/12/16 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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*与数字互转的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。