C語言基礎-04-字符串和處理函數

1、字符串簡介

* 在Java中,一個字符串能夠用String類型來存儲html

String s = "MJ";

C語言中沒有String這種類型。其實字符串就是字符序列,由多個字符組成,因此在C語言中,咱們能夠用字符數組來存儲字符串ios

字符串能夠看作是一個特殊的字符數組,爲了跟普通的字符數組區分開來,應該在字符串的尾部添加了一個結束標志'\0'。'\0'是一個ASCII碼值爲0的字符,是一個空操做符,表示什麼也不幹。因此採用字符數組存放字符串,賦值時應包含結束標誌'\0'。數組

* 字符串"mj"的存儲狀況以下(假設用字符數組char a[]來存儲):函數

注意了,尾部有個'\0',若是沒有這個結束標記,說明這個字符數組存儲的並非字符串spa

2、字符串的初始化

char a[3] = {'m', 'j', '\0'};

char b[3];
b[0] = 'm';
b[1] = 'j';
b[2] = '\0';

char c[3] = "mj";

char d[] = "mj";

char e[20] = "mj";

當咱們使用相似第8行的初始化方式時,系統會自動在字符串尾部加上一個\0結束符code

3、字符串的輸出

咱們可使用stdio.h中兩個函數來輸出字符串,分別是printf和puts函數orm

1.printf函數

* 這個函數咱們已經用過不少遍了,用格式符%s表示須要輸出一個字符串htm

char a[3] = {'m', 'j', '\0'};
printf("%s", a);

輸出結果:,最後面那個\0是不可能輸出的,它只是個空字符,只是字符串結束的標記。blog

* 說到這裏,有人可能會想:這樣看來,彷佛把最後的\0去掉也沒什麼影響吧,輸出結果應該仍是同樣的啊,都是"mj"。內存

咱們能夠試一下,把最後面的\0去掉,再進行輸出:

char a[3] = {'m', 'j'};
printf("%s", a);

輸出結果:,跟上面添加了\0的輸出結果是同樣的。

別高興地太早了,我只能說你這是僥倖同樣的,運氣好了一點。

* 咱們再來看一個例子

char a[3] = {'m', 'j', '\0'}; // 添加告終束符\0

char b[] = {'i', 's'}; // 假設忘記添加結束符\0

printf("字符串a:%s", a); // 輸出字符串a

printf("\n"); // 換行

printf("字符串b:%s", b); // 輸出字符串b


看清楚了,第3行的字符數組b後面沒有添加結束符\0,所以b不算是個正宗的字符串。

按照你的猜測,字符串b的輸出應該就是"is",可是輸出結果爲:,能夠看出,當咱們嘗試輸出b的時候,把a也輸出了。

要搞清楚爲何,首先要看看a和b的內存地址:

printf("a的地址:%x", a);
printf("\n");
printf("b的地址:%x", b);


輸出結果:,由這個數據咱們能夠分析出a和b的內存存儲狀況以下:

能夠看出來,數組b和a的內存地址是連續的。咱們再回到輸出b的代碼:

printf("字符串b:%s", b); // 輸出字符串b

%s表示指望輸出一個字符串,所以printf函數會從b的首地址開始按順序輸出字符,一直到\0字符爲止,由於\0是字符串的結束標記。

因此,若是想要建立一個字符串,記得加上結束符\0,否則後果很嚴重,會訪問到一些垃圾數據。

2.puts函數

1 char a[] = "mj";2 puts(a);3 4 puts("lmj");

看第2行代碼,puts函數會從a的首地址開始輸出字符,一直到\0字符爲止。

輸出結果:,能夠看puts函數輸出一個字符串後會自動換行

* puts函數一次只能輸出一個字符串,printf函數則能夠同時輸出多個字符串

printf("%s - %s", "mj", "lmj");

 

 4、字符串的輸入

stdio.h中有2個函數能夠用來接收用戶輸入的字符串,分別是scanf和gets

1.scanf函數

char a[10];
scanf("%s", a);

scanf函數會從a的首地址開始存放用戶輸入的字符,存放完畢後,系統會自動在尾部加上一個結束標記\0

注意,不要寫成scanf("%s", &a),由於a已經表明了數組的地址,不必再加上&這個地址運算符。

 

2.gets函數

char a[10];
gets(a);

gets跟scanf同樣,會從a的首地址開始存放用戶輸入的字符,存放完畢後,系統會自動在尾部加上一個結束標記\0。

* gets一次只能讀取一個字符串,scanf則能夠同時讀取多個字符串

* gets能夠讀入包含空格、tab的字符串,直到遇到回車爲止;scanf不能用來讀取空格、tab

5、字符串數組

1.字符串數組簡介

* 一維字符數組中存放一個字符串,好比一個名字char name[20] = "mj"

* 若是要存儲多個字符串,好比一個班全部學生的名字,則須要二維字符數組,char names[15][20]能夠存放15個學生的姓名(假設姓名不超過20字符)

* 若是要存儲兩個班的學生姓名,那麼能夠用三維字符數組char names[2][15][20]

 

2.字符串數組的初始化

char names[2][10] = { {'J','a','y','\0'}, {'J','i','m','\0'} };char names2[2][10] = { {"Jay"}, {"Jim"} };char names3[2][10] = { "Jay", "Jim" };

能夠把字符串數組看做是一維數組,它的元素是字符串。字符串數組names由字符串"Jay"和字符串"Jim"構成。

6、字符串處理函數

下面介紹的字符串處理函數都是在string.h頭文件中聲明的,使用前要包含這個頭文件。

1.strlen函數

* 這個函數能夠用來測量字符串的字符個數,不包括\0

int size = strlen("mj"); // 長度爲2
 
char s1[] = "lmj";
int size1 = strlen(s1); // 長度爲3
 
char s2[] = {'m', 'j', '\0', 'l', 'm', 'j', '\0'};
int size2 = strlen(s2); // 長度爲2




注:本文轉自M了個J的博客。

相關文章
相關標籤/搜索