【C語言】09-字串

來源:互聯網
上載者:User

說明:這個C語言專題,是學習iOS開發的前奏。也為了讓有物件導向語言開發經驗的程式員,能夠快速上手C語言。如果你還沒有編程經驗,或者對C語言、iOS開發不感興趣,請忽略

一、字串簡介

* 在Java中,一個字串可以用String類型來儲存

String s = "MJ";

C語言中沒有String這種類型。其實字串就是字元序列,由多個字元組成,所以在C語言中,我們可以用字元數組來儲存字串。

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

* 字串"mj"的儲存情況如下(假設用字元數組char a[]來儲存):

注意了,尾部有個'\0',如果沒有這個結束標記,說明這個字元數組儲存的並不是字串

 

二、字串的初始化
 1 char a[3] = {'m', 'j', '\0'}; 2  3 char b[3]; 4 b[0] = 'm'; 5 b[1] = 'j'; 6 b[2] = '\0'; 7  8 char c[3] = "mj"; 9 10 char d[] = "mj";11 12 char e[20] = "mj";

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

 

三、字串的輸出

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

1.printf函數

* 這個函數我們已經用過很多遍了,用格式符%s表示需要輸出一個字串

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

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

 

* 說到這裡,有人可能會想:這樣看來,似乎把最後的\0去掉也沒什麼影響吧,輸出結果應該還是一樣的啊,都是"mj"。

我們可以試一下,把最後面的\0去掉,再進行輸出:

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

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

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

 

* 我們再來看一個例子

1 char a[3] = {'m', 'j', '\0'}; // 添加了結束符\02 3 char b[] = {'i', 's'}; // 假設忘記添加結束符\04 5 printf("字串a:%s", a); // 輸出字串a6 7 printf("\n"); // 換行8 9 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");

 

 四、字串的輸入

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

 

五、字串數組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"構成。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.