c語言字符串比較大小規則 C字符串比較大小



文章插圖
c語言字符串比較大小規則 C字符串比較大小

文章插圖
01

char[]和char*之間的比較和轉換
在C++編程中,很多時候我們會遇到如何對char[]和char*進行比較,當然一般來說都是通過使用strcmp方法,當然看了C++ primer的話都知道不能使用“==”,那么先看看直接使用“==”是什么樣的結果 。
【c語言字符串比較大小規則 C字符串比較大小】如下面的程序:
#includeusing namespace std;int main() {char arrTest1[] = "abc";char arrTest2[] = "abc";cout << (arrTest1== arrTest2) << endl;char *pTest1 = "abc";char *pTest2 = "abc";cout << (pTest1 == pTest2) << endl;}這個程序的結果是:第一個打出的是0,而第二個打出的是1
問題分析:
那么為什么會有這種結果呢,首先需要知道的是這里“==”比較的不是指向的內容abc,
比較的是各個arrTest1和arrTest2對象中存儲的是指向內容的地址,換句話說就是abc的地址,不是它們本身的存儲的值 。
Array對象
對Array對象來說,是運行時在??臻g上分配的內存,所以每個對象都是單獨去申請內存,各自保存一份自己的abc,所以Array對象存儲的地址也是不一樣的,所以第一個結果是false;
Pointer對象
對Pointer對象來說,兩個字符指針并沒有分配相應的存儲區,是后面的abc是以字符串常量的形式存在常量區,然后把首地址的值賦值給了Pointer對象,所以Pointer對象存儲的地址應該來說是一樣的,所以第二個結果是true;
我們可以想到通過打印相關的地址來查看結果是否正確,但這里會有個問題:
數組對象下面直接打印數組對象,其實是打印的數組對象的內容,結果都是abc
cout << arrTest1<< endl;cout << arrTest2<< endl;對于數組對象可以這樣打印數組的首地址,可以從這里看出這兩個地址是不同的,即兩個abc存儲在不同的空間
cout << &arrTest1<< endl;cout << &arrTest2<< endl;輸出結果如下:
指針對象
下面直接打印指針對象,其實是打印的也是指針對象的內容,結果都是abc,這樣打印按道理
來說應該是打印的字符串的首地址,是因為對cout進行了重載,打印字符指針時,給出地址
不是打印地址內容,而是打印相對的字符的內容,所以會得到abc結果
cout << pTest1 << endl; cout << pTest2 << endl;
但是如果取該指針的地址來打印的話,結果兩個地址是不對的,因為此時打印的不是指向的字符串的首地址了,而是該指針變量的地址,當然不一樣
cout << &pTest1 << endl; cout << &pTest2 << endl;
如果要獲取指針對象的字符串的首地址的值的話,需要讓cout輸出符不認為它是一個字符指針,
這樣就不會產生重載操作了,這樣可以看到兩個輸出的地址是相同的
cout << (void*)pTest1<< endl; cout << (void*)pTest2<< endl;
輸出結果如圖:
那么直接比較char[]時,可以使用如下函數方式:
如果要比較的對象是char*字符串
int strcmp(const char* s1,const char* s2); char a[10]=”abc”,c[1000]=”abc”; printf(“%d”,strcmp(a,c)); //返回 0 表示相等
2. 如果要比較的對象是兩個string,則利用函數compare() 或者 ==
s1.compare(s2)
3. 注意:
C++中string類型與char*類型的字符串比較的一種實例,使用strcmp比較時需先將string轉換成char*類型再比較,此時可以用c_str()函數轉換 。
當然compare其中有一個重載如下,可以直接使用于string與char*或者與char[]進行對比
int compare (const char* s) const;#include <iostream>#include <cstring>using namespace std;int main(void){const char *passwd = "ap_passwd";string str = "ap_passwd";cout<<"passwd="<<passwd<<", str="<<str<<endl;if ( str.compare(passwd) == 0){cout<<"The compare euqal!"<<endl;}else{cout<<"is not equal!"<<endl;}return 0;}運行:passwd=ap_passwd, str=ap_passwdThe compare euqal!02

三者之間的轉換
三者之間的轉換
1. string類如何轉換為char *呢?
首先必須了解,string可以被看成是以字符為元素的一種容器 。字符構成序列(字符串) 。有時候在字符序列中進行遍歷,標準的string類提供了STL容器接口 。具有一些成員函數比如begin()、end(),迭代器可以根據他們進行定位 。
注意,與char*不同的是,string不一定以NULL(‘’)結束 。string長度可以根據length()得到,string可以根據下標訪問 。所以,不能將string直接賦值給char* 。
把string轉換為char* 有3種方法:1.datastring str="abc";char *p=(char *)str.data();2.c_strstring str="gdfd";char *p=str.c_str();3. copystring str="hello";char p[40];str.copy(p,5,0); //這里5,代表復制幾個字符,0代表復制的位置*(p+5)=''; //要手動加上結束符2.char[]轉換為string類
直接賦值即可 。
3. string類轉換為char[]
char *strcpy(char *a,const char *b){if(a == NULL || b == NULL)exit(0);char *c = a;while((*a++ = *b++) != '');return c;}char c[20];string s="1234";strcpy(c,s.c_str())