指針和字符串之間的聯系


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM