1. 程式人生 > >字串、陣列、指標總結(C語言)

字串、陣列、指標總結(C語言)

一、字串常量

位於一對雙引號中的任意字元,如果字串文字中間沒有間隔或間隔是空格符,ANSI C會將它串起來。例如

char str[50]="hello" "wo" "you!";  和   char st[50]="wo,nihao!";     都是字串。

二、字串陣列及其初始化

定義一個字串陣列時,必須要讓編譯器知道它需要多大空間。

count char str[50]="hello, I am asfsvdx!";      count 表示這個字串不可以改變。相比下面的初始化很簡短:

count char str1[50]={'h','e','l','l','o','\0'};

注意標示結束的空字元,如果沒有‘\0’,它就是一個字元陣列,而不是一個字串

指定陣列大小時,一定要確保陣列元素比字串長度至少多1,用於存放空字元。未被使用的空間會被預設為‘\0’。

也可以讓編譯器決定陣列大小:

count char str2[]="asfawsgasdf";

字元陣列名也是陣列首元素地址。

str2==&str2[0]    *str2='a'    *(str2+1)==str2[1] =='s'   

的確,也可以用 指標符號建立字串    例如:

count char *str[]="asfasfgsdg";  

三、陣列與指標

char str1[]="I love you!";// 初始化存放字串的陣列

char *str="I love you!";   //初始化一個指向字串的指標

他們主要的差別在於 str1是一個常量,而指標 str 是一個變數。

首先,兩者都可以使用陣列符號:

for(int i=0;i<6;i++){                                          for(int i=0;i<6;i++){  

        putchar(str1[i]);                                                   putchar(str[i]);

}                                                                      }

輸出: I love                                               I love

其次,兩者都可以使用指標加法:

for(int i=0;i<6;i++){                                          for(int i=0;i<6;i++){  

        putchar(*(str1+i));                                                   putchar(*(str+i));

}                                                                      }

輸出: I love                                               I love

但是隻有指標可以使用增量運算

while(*str)

    putchar(*(str++));

輸出: I love you!

如果希望str1[] 和 str 相同 ,可以   str=str1;//str指向陣列str1

陣列元素是變數,但是陣列名不是變數。

四、字串和指標

指標str 和 copy 存放在00AFFA8C和00AFFA80兩個位置,但是他們都存放了這個字串的地址,因此,字串本身沒有被複制,只是讓第二個指標也指向同一個字串。

五、字串函式

1、gets()

它從系統的標準輸入裝置(通常是鍵盤)獲得一個字串,字串結束標誌是換行符\n ,讀取到換行符後會丟棄它,引數是字串的地址,注意,陣列名當然也是一個地址。它返回一個指向char的指標。

2、fgets()

它需要第二個引數來說明最大讀入字元數,這樣不會造成溢位的問題。如果這個引數是n,fgets()就會讀取最多n-1個字元,或者讀取到換行符結束。如果讀到換行符,會把它存到字串裡。他還需要第三個引數表示讀哪一個檔案。

注意:由於gets()不檢查目標陣列是否能夠容納輸入,所以很不安全。蠕蟲病毒就是利用這一缺點。對於重要的程式設計應用fgets()而不是gets();

3、puts()

使用很簡單,只需要給出字串引數的地址。例如

#define   STR    "I am boy."

char str1[80]="An array was initialized to me.";

const char *str2="A pointer was initialized to me.";

puts("I am an argument to puts().");

puts(STR);

puts(str1);

puts(str2);

puts(&str1[5]);

puts(str2+4);

輸出:
I am an argument to puts().

I am boy.

An array was initialized to me.

A pointer was initialized to me.

ray was initialized to me.

inter was initialized to me.

puts()顯示字串後自動加換行符。表示式的地址正是函式輸出字元的起點。並在輸出‘\0’停止。

4、fputs()

第二個引數是說明要寫的檔案。fputs並不會自動加換行符。

5、strlen()

可以得到字串的長度。讀到‘\0’停止。

6、strcat()

函式有兩個引數,將第二個字串的拷貝新增到第一個末尾,從而使第一個成為一個新的字串,函式返回新增的字串的第一個字元的地址。

7、strncat()

strcat()並不檢查第一個陣列能否容納第二個字串。可能會出現溢位,所以strncat()第三個引數來指明最多允許新增的字元數。

8、strcmp()

可以比較兩個字串的內容是否相同,如果相同返回0。它的引數比較的是字串而不是陣列和字元,比如“asf”“A”,而不是‘A’。

函式的返回值:

返回的是第一個不同的字元的ASCII值的差。相等返回0.

9、strncmp()

第三個引數可以指定比較前多少個字元。

10、strcpy()、strncpy()

可以複製字串,要注意,並不是真的複製了字串,而是複製了指向這個字串的地址。

strncpy也是比較謹慎的選擇,提供第三個引數,表示需要複製的字元數。如果大於第一個陣列的大小,就停止複製。