1. 程式人生 > >指標和字串之間的聯絡

指標和字串之間的聯絡

0.常見誤區

  1. c語言中沒有string基本資料型別

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

  2. 字串通過字元陣列來定義時,預設會在陣列最後一個元素加上'\0'作為結束標誌

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

//此string1後面不會有'\0'標誌,就是一般的字元陣列
char string1[3]={'a','b','c'};

//string2為字串形式,結尾有\0標誌,長度為4
char string2[4]="abc"    

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

如果字元陣列長度不夠,則編譯器報錯

D:\otherworkspace\devcppworkspace\ds\ds-c2\demo5.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("%p\t",string+i);    
         printf("%p\t",&string[i]);
         printf("%c\n",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: %zu\n", strlen(str));
    printf("with null character:    %zu\n", sizeof(str) );
    return 0; 
}

output

without null character: 45
with null character:    46