指針和字元串之間的聯繫

  • 2019 年 10 月 29 日
  • 筆記

0.常見誤區

  1. c語言中沒有string基本數據類型

    C語言里有<string.h>這個頭文件,所以就想當然的認為C語言里有string這個類型,通過下面這種形式來聲明string的變數 string aString; 編譯失敗。原來C語言里壓根就沒有string這個類型,所以字元串都是通過char數組來存儲的, 而<string.h>這個頭文件里聲明的函數原型也全是針對char數組的種種操作。直到C++中才出現了string這個類(注意是類, 不是類型)。

  2. 字元串通過字元數組來定義時,默認會在數組最後一個元素加上’’作為結束標誌

  3. 鑒於第二點,如果要區分普通的字元數組和字元串,參考如下程式碼

//此string1後面不會有''標誌,就是一般的字元數組  char string1[3]={'a','b','c'};    //string2為字元串形式,結尾有標誌,長度為4  char string2[4]="abc"    

注意:這裡的string2的長度可以不限定,默認省略,交給編譯器自動設定長度,如果需要人為設定長度,則需要考慮到’’字元

如果字元數組長度不夠,則編譯器報錯

D:otherworkspacedevcppworkspacedsds-c2demo5.cpp [Error] initializer-string for array of chars is too long [-fpermissive]

  1. 數組名字和指針的關係

    示例程式碼如下:

    #include<stdio.h>    int main(){   int i;   char string[]="abc";   for(i = 0;i<4;i++){       printf("%pt",string+i);       printf("%pt",&string[i]);       printf("%cn",string[i]);   }   return 0;  } 

    列印結果

    000000000062FE10        000000000062FE10        a  000000000062FE11        000000000062FE11        b  000000000062FE12        000000000062FE12        c  000000000062FE13        000000000062FE13

    根據程式碼的運行結果來看,string【也就是數組名字】其實就是一個指針,它指向了第1個元素【下標為0】,我們可以直接對指針進行算數運算,它會自動的根據指針類型移動相應的長度,比如說這裡的指針就是字元型,佔一個位元組,那麼string++,就會自動把指針往後移動一個位元組。

1.0 字元串的讀取

#include <stdio.h>  int main()  {      char name[20];      printf("Enter name: ");      scanf("%s", name);      printf("Your name is %s.", name);      return 0;  }

運行結果:

Enter name: Dennis Ritchie  Your name is Dennis.

scanf()函數讀取字元序列,當遇到空格(space,newline,tab etc.)時停止讀取。

那麼如何讀取行呢?

#include <stdio.h>  int main()  {      char name[30];      printf("Enter name: ");      fgets(name, sizeof(name), stdin);  // read string      printf("Name: ");      puts(name);    // display string      return 0;  }

輸出

Enter name: Tom Hanks  Name: Tom Hanks

在這裡,我們使用了fgets()函數從終端讀取字元串。 fgets(name,sizeof(name),stdin); sizeof(name)的結果為30。因此,我們最多可以輸入30個字元作為輸入,即name字元串的大小,也可以指定為其它的長度。 為了列印字元串,我們使用了puts(name),你也可以直接使用printf()函數列印。

注意:gets()函數也可以接受用戶的輸入。但是,它已從C標準中刪除。 這是因為gets()允許輸入任意長度的字元。因此,可能存在緩衝區溢出。

1.1字元串長度的獲取

示例程式碼

//求字元串長度  #include <string.h>  #include <stdio.h>    int main(void)  {      const char str[] = "How many characters does this string contain?";        printf("without null character: %zun", strlen(str));      printf("with null character:    %zun", sizeof(str) );      return 0;  }

output

without null character: 45  with null character:    46