1. 程式人生 > >C++ 指標 陣列 字串

C++ 指標 陣列 字串

  • 字串變數的定義和引用

  1. 標頭檔案#include<string>
  2. 字串會自動在末尾加上結束符‘/0’
  3. 既可以用字串常量給字串變數賦值,也可以用一個字串變數給另一個字串變數賦值。
  4. 可以對字串變數中某一字元進行操作,string word=″Then″;word[2]=′a′;
  5. 可以在輸入輸出語句中用字串變數名,輸入輸出字串
    cin>> string1; //從鍵盤輸入一個字串給字串變數string1
    cout<< string2; //將字串string2輸出
  • 字串變數的運算

  1. 字串複製用賦值號
    string1=string2;
    其作用與“strcpy(string1,string2);”相同。
  2. 字串連線用加號
    string string1=″C++″; //定義string1並賦初值
    string string2=″Language″;//定義string2並賦初值
    string1=string1 + string2;//連線string1和string2。連線後string1為″C++ Language″。
  3. 字串比較直接用關係運算符
    可以直接用 ==(等於)、>(大於)、<(小於)、!=(不等於)、>=(大於或等於)、<=(小於或等於)等關係運算符來進行字串的比較。
  4. 字串連線strcat
    strcat(char[],const char[]);//該函式有兩個字元陣列的引數,函式的作用是:
                                //將第二個字元陣列中的字串連線到前面字元陣列的字串的後面。

     

  5. 字串複製函式strcpy
    strcpy(char[],const char[]);//它的作用是將第二個字元陣列中的字串複製到第一個字元陣列中去
                                //將第一個字元陣列中的相應字元覆蓋。
    /*
    
    1.在呼叫strcpy函式時,第一個引數必須是陣列名(如str1),第二個引數可以是字元陣列名,也可以是一個字串常量。
    
    2.可以用strcpy函式將一個字串中前若干個字元複製到字元陣列中去。
    
    3.只能通過呼叫strcpy函式來實現將一個字串賦給一個字元陣列,而不能用賦值語句將一個字串常量或字元陣列直接賦給一個字元陣列。
    
    */

    只能通過呼叫strcpy函式來實現一個字串賦給一個字元陣列,而不能用賦值語句直接將字串常量或者字元陣列賦給一個字元陣列。

  6. 字串比較strcmp
    strcmp(const char[],const char[]);//作用是比較兩個字串。
                                      //由於這兩個字元陣列只參加比較而不應改變其內容,
                                      //因此兩個引數都加上const宣告
    /*
    1.如果字串1=字串2,函式值為0。
    2.如果字串1>字串2,函式值為一正整數。
    3.如果字串1<字串2,函式值為一負整數。
    */

    注意:對兩個字串比較,不能用以下形式:
    if(str1>str2) cout<<″yes″;
    字元陣列名str1和str2代表陣列地址,上面寫法表示將兩個陣列地址進行比較,而不是對陣列中的字串進行比較。

  7. 字串長度strlen
    strlen(const char[]);//它是測試字串長度的函式。其函式的值為字串中的實際長度,不包括′\0′在內。

    得到的是實際長度,不包括‘/0’在內

  8. 字元轉換  #include <stdlib.h> http://www.cnblogs.com/processakai/archive/2011/06/24/2089348.html

atof(將字串轉換成浮點型數)
atoi(將字串轉換成整型數)

atol(將字串轉換成長整型數)
strtod(將字串轉換成浮點數)
strtol(將字串轉換成長整型數)
strtoul(將字串轉換成無符號長整型數)
toascii(將整型數轉換成合法的ASCII 碼字元)
toupper(將小寫字母轉換成大寫字母)
tolower(將大寫字母轉換成小寫字母)

 int atoi(const char *nptr);
函式說明 atoi()會掃描引數nptr字串,跳過前面的空格字元,直到遇上數字或正負符號才開始做轉換,而再遇到非數字或字串結束符('\0')才結束轉換,並將結果返回。
附加說明 atoi()與使用strtol(nptr,(char**)NULL,10);結果相同。
 

     #include<stdlib.h>
     mian()
     {
     char a[]=”-100”;
     char b[]=”456”;
     int c;
     c=atoi(a)+atoi(b);
     printf(c=%d\n”,c);
     }
  執行 c=356
  •  字串變數長度

length() size()

#include <string>
string s = "hello world";//本質是string類,沒有‘/0’,包含成員函式length()
int len = s.lenght();//得到真實長度11
cout<<len<<endl;
  •  字串變數輸入輸出

string類過載了輸入輸出的運算子,用”>>”進行輸入,用”<<”進行輸出

輸入的運算子“>>”預設會忽略空格,遇到空格就認為輸入結束

 


  • 字串陣列

  1. 在一個字串陣列中包含若干個(現為5個)元素,每個元素相當於一個字串變數。
  2. 並不要求每個字串元素具有相同的長度,即使對同一個元素而言,它的長度也是可以變化的,當向某一個元素重新賦值,其長度就可能發生變化。
  3. 在字串陣列的每一個元素中存放一個字串,而不是一個字元,這是字串陣列與字元陣列的區別。如果用字元陣列存放字串,一個元素只能存放一個字元,用一個一維字元陣列存放一個字串。
  • 獲取字串/字串陣列長度

  1. 1 sizeof()
  • 求所佔總空間的位元組數,靜態的,跟初始狀態字元陣列的大小有關係,大小等於初始時字元陣列的大小或者等於初始時字元陣列的大小+1 
  • 在C++中,如果定義的是字串陣列的話,那麼如果想獲取陣列的長度,只能用sizeof(陣列名),而不能用strlen(str)
  • sizeof(...)是運算子,在標頭檔案中typedef為unsigned int,其值在編譯時即計算好了,引數可以是陣列、指標、型別、物件、函式等。
    它的功能是:獲得保證能容納實現所建立的最大物件的位元組大小。
    由於在編譯時計算,因此sizeof不能用來返回動態分配的記憶體空間的大小。實際上,用sizeof來返回型別以及靜態分配的物件、結構或陣列所佔的空間,返回值跟物件、結構、陣列所儲存的內容沒有關係。
    具體而言,當引數分別如下時,sizeof返回的值表示的含義如下:
    陣列——編譯時分配的陣列空間大小;
    指標——儲存該指標所用的空間大小(儲存該指標的地址的長度,是長整型,應該為4);
    型別——該型別所佔的空間大小;
    物件——物件的實際佔用空間大小;
    函式——函式的返回型別所佔的空間大小。函式的返回型別不能是void。
    char str[20]="0123456789"; 
    int   a=strlen(str); //a=10;strlen 計算字串的長度,以\0'為字串結束標記。 
    int   b=sizeof(str); //b=20;sizeof 計算的則是分配的陣列str[20] 所佔的記憶體空間的大小,
                         //不受裡面儲存的內容影響
    
    char *str1="absde";
    char str2[]="absde";
    char str3[8]={'a',};
    char ss[] = "0123456789";
    
    輸出:
    
    sizeof(str1)=4;
    sizeof(str2)=6;
    sizeof(str3)=8;
    sizeof(ss)=11
    
    str1是一個指標,只是指向了字串”absde”而已。所以sizeof(str1)不是字串佔的空間也不是字元陣列佔的空間,而是一個字元型指標佔的空間。所以sizeof(str1)=sizeof(char*)=4,在C/C++中一個指標佔4個位元組
    
    str2是一個字元型陣列。C/C++規定,對於一個數組,返回這個陣列佔的總空間,所以sizeof(str2)取得的是字串”absde”佔的總空間。”absde”中,共有a b s d e \0六個字元,所以str2陣列的長度是6,所以sizeof(str2)=6*sizeof(char)=6
    
    str3已經定義成了長度是8的陣列,所以sizeof(str3)為8
    
    str4和str2類似,’0’ ‘1’ … ‘9’加上’\0’共11個字元,所以ss佔的空間是11
    
    總之,對於指標,sizeof操作符返回這個指標佔的空間,一般是4個位元組;而對於一個數組,sizeof返回這個陣列所有元素佔的總空間。char*與char[]容易混淆,一定要分清,而且char*=”aaa”的寫法現在不被提倡,應予以避免

     

  • 對於指標,sizeof操作符返回這個指標佔的空間,一般是4個位元組;

  • 而對於一個數組,sizeof返回這個陣列所有元素佔的總空間。

  • strlen不區分是陣列還是指標

  1. 2 strlen()
  • trlen()是函式,要在執行時才能計算。
  • 引數必須是字元型指標(char*),所以不能把字串變數名作為引數。當陣列名作為引數傳入時,實際上陣列就退化成指標了。
/*strlen()*/
string 函式求是字串的實際長度,它可以用來獲取動態實際字元陣列的長度,到第一個“\0”的長度,且不將‘\0’計算在內。
  • 對比
              char arr[10] = "What?";
              int len_one = strlen(arr);
              int len_two = sizeof(arr); 
              cout << len_one << " and " << len_two << endl; 
    輸出結果為:5 and 10
    點評:sizeof返回定義arr陣列時,編譯器為其分配的陣列空間大小,不關心裡面存了多少資料。
    strlen只關心儲存的資料內容,不關心空間的大小和型別。
    
              char * parr = new char[10];
              int len_one = strlen(parr);
              int len_two = sizeof(parr);
              int len_three = sizeof(*parr);
              cout << len_one << " and " << len_two << " and " << len_three << endl;
    輸出結果:23 and 4 and 1
    點評:
    第一個輸出結果23實際上每次執行可能不一樣,這取決於parr裡面存了什麼(從parr[0]開始知道遇到第一個NULL結束);
    第二個結果實際上本意是想計算parr所指向的動態記憶體空間的大小,但是事與願違,sizeof認為parr是個字元指標,因此返回的是該指標所佔的空間(指標的儲存用的是長整型,所以為4);
    第三個結果,由於*parr所代表的是parr所指的地址空間存放的字元,所以長度為1。
     
  1. 3 str.length()和str.size()是用於求string類物件的成員函式 

  • 字串及字元陣列要點

  1. sizeof是算符,strlen是函式。
  2. sizeof可以用型別做引數,strlen只能用char*做引數,且必須是以”\0”結尾的。
  3. 陣列做sizeof的引數不退化,傳遞給strlen就退化為指標了。
  4. strlen的結果要在執行的時候才能計算出來,時用來計算字串的長度,不是型別佔記憶體的大小。
  5. 陣列在宣告時如果不進行初始化,一定要指明大小

 


  • 參考博文

https://blog.csdn.net/Xiao_Yanci/article/details/79111186

https://blog.csdn.net/m0_37592397/article/details/79701992