字串、陣列、指標總結(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也是比較謹慎的選擇,提供第三個引數,表示需要複製的字元數。如果大於第一個陣列的大小,就停止複製。