char acStr[] = "aaaaa";//這個是字符數組,只含有5個字符
char *pcStr = "aaaaa";//這個是字符串,含有6個字符,即5個a加一個結束符'\0'
輸出的結果 strlen()長度都是5, 所以即便是字符串,最后取長度的時候,也不考慮\0: strlen()計算字符串長度,忽略結束符 \0
char *p = "hello";
char *q = "world";
char o[] = "hello";
cout<<"hello"<<strlen(p)<<endl; //5
cout<<"world"<<strlen(q)<<endl; //5
cout<<"o[]"<<strlen(o)<<endl; //5
cout<<strlen("hello")<<endl; //5
1. 字符串實際要比字符數組多一個空間 用來存放結束符 \0
char *p = "hello";
char *q = "world"; //比如world實際上存放了6個字符位, 5個字符+'\0'
但是求長度, 返回的值仍然是5: 並不考慮 結束符\0的位
cout<<"hello"<<strlen(p)<<endl;
cout<<"world"<<strlen(q)<<endl;
2. 字符數組是不用存放\0位的,所以分配的字符位數 只要給 strlen(p)就行了, 不需要+1:
a[0] = new char[strlen(p)];
a[1] = new char[strlen(q)];
用字符數組和字符指針變量都可實現字符串的存儲和運算。 但是兩者是有區別的。在使用時應注意以下幾個問題:
1. 字符串指針變量本身是一個變量,用於存放字符串的首地址。而字符串本身是存放在以該首地址為首的一塊連續的內存空間中並以‘\0’作為串的結束。字符數組是由於若干個數組元素組成的,它可用來存放整個字符串。
2. 對字符數組作初始化賦值,必須采用外部類型或靜態類型,如: static char st[]={“C Language”};而對字符串指針變量則無此限制,如: char *ps="C Language";
3. 對字符串指針方式 char *ps="C Language";可以寫為: char *ps; ps="C Language";而對數組方式:
static char st[]={"C Language"};
不能寫為:
char st[20];st={"C Language"};
而只能對字符數組的各元素逐個賦值。
從以上幾點可以看出字符串指針變量與字符數組在使用時的區別,同時也可看出使用指針變量更加方便。前面說過,當一個指針變量在未取得確定地址前使用是危險的,容易引起錯誤。但是對指針變量直接賦值是可以的。因為C系統對指針變量賦值時要給以確定的地址。因此,
char *ps="C Langage";
或者 char *ps;
ps="C Language";都是合法的。
C++提供兩種字符串的表示方法:c風格的字符串和標准c++引入的string類類型。建議使用string類。
1. C風格字符串
字符串存儲在一個字符數組中,一般通過一個char *類型指針操縱它。然而,系統內部實際上是存儲在一個字符串數組中,然后,st指向數組的第一個元素:
Char *st=”hello world”;
常用指針的算術運算來遍歷c風格的字符串,每次指針增加1,直到空字符為止:
While(*st++){…}
當包含:#include<cstring.h>
//返回長度
Int strlen(const char *);
//比較兩字符串是否相等
Int strcmp(const char*,const char *);
//以下兩個的使用方式不清楚
//第二個字符拷貝至第一個
Char *strcpy(char *,const char *);
//第二個字符接至第一個后面
Char *strcat(char*,const char *);
C風格字符串的長度可以是0,有兩種方式:
Char *pc1=0;
Char *pc=””;
一個測試程序:
#include<iostream.h>
// without ".h",eagerly learn to know why
#include<cstring>
main(){
// temp setting avoids chaning the value of p;
//and p can`t be constant,for it will be resetted by function strcat();
char *p="Hello world!",*temp=p;
const char *q="Nice to see you!";
cout<<p<<q<<endl;
cout<<*p<<","<<*(q+1)<<endl;
p=temp;
cout<<"p is made by:\n";
for(int i=0;i<strlen(p);i++)
cout<<*temp++<<endl;
}
2. 字符串類型
C++標准庫對此進行支持。
使用string類,必須包含頭文件:
#include<string>
String st(“Hello world”);
//返回長度(不包含空字符)
St.size();
String st2;
//檢查是否是空
St2.empty()=true or false;
//復制兩個字符串
String st3(st);
St2=st3;//simple
//比較是否相等
If(st2==st3){….}
//兩個字符串連接成第三個字符串
String s1(“hello,”);
String s2(“world!”);
String s3=s1+s2;
//或者,直接加到s1
S1+=s2;
//可以把一個c風格的字符串轉換成string類對象
Const char *pc=”a try”;
String s1=pc;//ok
//但,反向的轉換不能自動執行
Char *str=s1;//error
為實現這種轉換必須顯示調用名為c_str()
//幾乎正確的
char *str=s1.c_str();
但為了防止字符數組被程序直接處理,c-str()返回的一個指向常量數組的指針:const char*,str被定義為非常量指針,所以違例。正確是:
Const char *str=s1.c_str();//ok
String 類型支持通過下標操作符號訪問單個字符。
一個例子:
l const 限定修飾符
for( int index=0;index<512;index++)
第一個問題是可讀性,即512是什么意思?第二個問題是可維護性,如多處修改會陷入麻煩。
Const int bufsize=512;
For(int index=0;index<bufsize;index++)
Const類型限定符提供了一個解決方案,把一個對象(變量)轉換成一個常量(constant)。在程序中任何改變這個值的企圖都將導致編譯錯誤,因此,被稱為只讀的。
而且常量定義后必須初始化,因為不能修改。