【char待整理】C++中string,char[]與char +關係、區別與轉換

C++中string、char *、char[]的轉換https://www.cnblogs.com/Pillar/p/4206452.html

strcpy(ebrstItem.EBRST_RptTime, tEbd.strEBDTime.c_str());
//將string轉換成const char * 在拷貝給char[]

首先必須瞭解,string可以被看成是以字符爲元素的一種容器。字符構成序列(字符串)。有時候在字符序列中進行遍歷,標準的string類提供了STL容器接口。具有一些成員函數比如begin()、end(),迭代器可以根據他們進行定位。

注意,與char*不同的是,string不一定以NULL('\0')結束。string長度可以根據length()得到,string可以根據下標訪問。所以,不能將string直接賦值給char*。

char *轉換成string

可以直接賦值。

string s;
char *p = "adghrtyh";
s = p;

char[] 轉換成string

可以直接賦值。

這裏有一點要說明,當聲明瞭string類型變量s後,用printf("%s",s);是會出錯的,因爲“%s”要求後面的對象的首地址。但是string不是這樣的一個類型。所以肯定出錯。

string 轉換成 char *

如果要將string直接轉換成const char *類型。string有2個函數可以運用。一個是.c_str(),一個是data成員函數。例子如下:

string s1 = "abcdeg";
const char *k = s1.c_str();
const char *t = s1.data();
printf("%s%s",k,t);
cout<<k<<t<<endl;

如上,都可以輸出。內容是一樣的。但是隻能轉換成const char*,如果去掉const編譯不能通過。下面解釋下該問題,const char*是不能直接賦值到char*的,這樣編譯都不能通過,理由:假如可以的話,那麼通過char*就可以修改const char指向的內容了,這是不允許的。所以char*要另外開闢新的空間,即上面的形式。

那麼,如果要轉換成char*,可以用string的一個成員函數copy實現。

string s1 = "abcdefg";
char *data;
int len = s1.length();
data = (char *)malloc((len+1)*sizeof(char));
s1.copy(data,len,0);
printf("%s",data);
cout<<data;

string轉換成char[]

這個由於我們知道string的長度,可以根據length()函數得到,又可以根據下標直接訪問,所以用一個循環就可以賦值了。

這樣的轉換不可直接賦值。

string pp = "dagah";
char p[8];
int i;
for( i=0;i<pp.length();i++)
    p[i] = pp[i];
p[i] = '\0';
printf("%s\n",p);
cout<<p;

char[]數組該如何賦值

1、定義的時候直接用字符串賦值

char a[10]="hello";

注意:不能先定義再給它賦值,如char a[10]; a[10]="hello";這樣是錯誤的!a雖然是指針,但是它已經指向在堆棧中分配的10個字符空間,現在這個情況a又指向數據區中的hello常量,這裏的指針a出現混亂,不允許!

2、對數組中字符逐個賦值

char a[10]={'h','e','l','l','o'};

3、利用strcpy

char a[10]; strcpy(a, "hello");/*給數組賦字符串*/ .

strcpy

char * strcpy(char * strDest,const char * strSrc) 

strcpy函數:顧名思義字符串複製函數:

原型:extern char *strcpy(char *strDest,char *strSrc);

功能:把從strSrc地址開始且含有NULL結束符的字符串賦值到以strDest開始的地址空間,返回strDest(地址中存儲的爲複製後的新值)。要求:strSrc和strDest所指內存區域不可以重疊且strDest必須有足夠的空間來容納strSrc的字符串。

該函數的參數是字符指針,也就是可以是字符串變量和字符數組,因爲它們的變量名代表首字符地址。字符串默認有一個null結束符,字符數組沒有。所以此處需要注意:因爲strSrc要求有null結束符,所以字符數組的長度必須大於等於src包含null結束符的總長度。例如,char* src="abcd"; char dest[5]; 這裏dest的長度就至少爲5。

char[]和char*區別

char a[20]=" hello world\n";

char *b=" hello world\n";

當字符數組未指定大小時,數組佔用的空間其實就是數組內字符所佔用的空間,一個字符一個字節。所以sizeof a的結果是字符數組實際存儲數據的大小。

對於char*等於的指針,只要是求指針的大小的時候,它的值都是4,不管指針定義的類型。

當字符數組指定大小時,數組佔用的空間就是它指定大小。char a[20]指定的大小是20,所以它佔用的空間就是20字節。

若指針變量前有類型時,其結果等於1。*可以理解爲一個地址類型,b才存放着另外一個變量的地址。sizeof *b

將a作爲參數存入另一個函數中,在另一個函數中,size函數輸出的結果會是多少呢?結果是4。其實coutsize(char a[])與coutsize(char *a)是一樣的,它是不會爲你記錄數組的大小,而是傳入了地址參數。

首先看指針:

char *p = “helloworld”;

    在這裏p是一個變量,其類型爲指針類型,並且指向一個字符串,字符串內容爲”helloworld”,如果要訪問p[2]的話,就需要先從p中取出地址,該地址爲”helloworld”的首地址,然後再加上偏移量2,就得到了’l’這個字符,所以其訪問的方式爲先從p中取出地址,然後再將該地址加上偏移量,得到一個地址,最後從這個地址中取出值來。其分爲三步:

1.取p的值,該值即爲字符串的首地址;

2.該地址加上偏移量,得到所要取的字符的地址;

3.從這個地址中取得值。

此處p是一個變量,它自己是存放在一個地址中的,而它的內容則是”helloworld”這個字符串的地址. p與字符串是分開的。

    同時,該指針的值是動態確定的,必須在運行的時候才能確定其值,並通過該值訪問到字符串。

    而如果是數組的話,則爲

char p[20] = “helloworld”;

    在這裏p爲一個字符串的標識,其類型是一個字符數組的類型,且該數組有20個char類型的大小.此時如果要訪問p[2]的話,分2步:

1.直接使用該字符數組的首地址加上2個char類型的大小的長度就得到了要訪問的字符的地址;

2.最後再從這個地址中取出值來.而且此時p的地址爲該字符數組的首地址,其內容爲’h’,一個字符類型。

    所以在這個地方數組與指針是不相同的,因爲此時數組取值的第一步並不是從p中讀取地址來再加上偏移量的.此時的p這個地址的值就爲’h’這個字符,其類型爲字符型而不是一個指針類型.此時p的地址與p[0]的地址是相同的。

    同時,每個符號的地址在編譯時就確定了,所以這裏p的地址就已經確定了,如果需要訪問p[2],則直接使用該地址加上2這個偏移量就可以取到這個值了.它不需要指令再取得這個首地址.而第一種情況下,還需要指令取得指針中的值,並通過這個值來訪問字符串。

    一個直觀的看法就是前一種是兩個不同的, 而後一種則是在同一個裏面。

    另外,還有一個不同之處在於第一個情況下 p 指向的是一個常量區, 是不能改變的, 即不能夠對p[i]賦值, 而第二種情況下, p是一個字符數組, 其是可以改變的,可以對p[i]賦值的。

  他們倆*p的值是一樣的,都是h字符!

---------------------

作者:johnny710vip

來源:CSDN

原文:https://blog.csdn.net/johnny710vip/article/details/6725637

版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

 

最後,如果要把一個const char*的字符串賦給char*,不能用=號,只能用strcpy!!!

問題是這樣產生的,先看這個函數原型:

1

void someFunc(char *someStr);

再看這個函數調用:

1

someFunc("I'm a string!");

把這兩個東西組合起來,用最新的g++編譯一下就會得到標題中的警告。

爲什麼呢?原來char *背後的含義是:給我個字符串,我要修改它。

而理論上,我們傳給函數的字面常量是沒法被修改的。

所以說,比較和理的辦法是把參數類型修改爲const char *。

這個類型說背後的含義是:給我個字符串,我只要讀取它。

 

如何同時接收const類型和非const類型?重載

#include <iostream>

using namespace std;

int fuc(char *a)

{

cout << a << endl;

}

int fuc(const char *a)

{

cout << a << endl;

}

int main()

{

char a[] = "hello 123";

fuc(a);

const char b[] = "hello 123";

fuc(b);

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章