[C] 每天來點字串用法 (基本篇)
有感於 C 的字元陣列實在有夠難(只是你廢),所以決定每天搞懂一點關於它的性質或用法之類的,希望我能夠持之以恆。
另外,許多函式都會使用字元指標來操作字串:
而對於字元指標的宣告,C 有一個特別的地方,他可以直接讓字元指標類的字串有初始值:
接著讓我們看看字串的輸出:
他的功用是:標記出字串的結束。看到我們上面輸出中的 s1 字串,我們明明就宣告了 128 個空間,但為什麼輸出結果只有 11 個字元?剩下的去哪了呢?正是被 '\0' 擋掉了。'\0' 明確的告訴程式:在我後面的都是垃圾,不要用,因此我們才能正確的輸出。
但是,我們在初始化的時候並沒有把 '\0' 寫出來啊?其實是編譯器會幫我們在字串結尾補上 '\0',所以基本上我們不用擔心忘記加上 '\0' 就會世界毀滅之類的(並不會。 另外,'\0' 的 ASCII 值正好是 0。
我們可以利用 sizeof 來驗證 '\0' 的存在:
1) s1 代表 s1[0] 的位址
2) 因為 s3 指向 s2[0],所以 s3 本身儲存了 s2[0]的位址
最後要注意的是:scanf() 讀字串時遇到空格就會斷開,而如果有剩下的部分,會被留在緩衝區裡等待下一次的 scanf()。另外,scanf() 也會在讀入的字串後補上 '\0'。
如果想要連同空格一起吃入字串的話,可以這麼寫:
- 基本使用
char s1[128] = "hello world";
char s2[] = "hello world";
另外,許多函式都會使用字元指標來操作字串:
char *s3 = s1; // 相當於 char *s3 = &s1[0]
而對於字元指標的宣告,C 有一個特別的地方,他可以直接讓字元指標類的字串有初始值:
char *s4 = "hello world";
像 s4 這種情況,是由編譯器在唯讀記憶體中放入 "hello world" 這個字元陣列,再讓 s4 這個指標指向它。因為是唯讀的記憶體,所以我們不能更改這個字串的內容,但可以更改 s4 指向的位址。接著讓我們看看字串的輸出:
char s1[128] = "hello world";
printf("%s\n", s1); // hello world
char s2[] = "hello world";
printf("%s\n", s2); // hello world
char *s3 = s1;
printf("%s\n", s3); // hello world
char *s4 = "hello world";
printf("%s\n", s4); // hello world
- 關於 '\0' 字元
他的功用是:標記出字串的結束。看到我們上面輸出中的 s1 字串,我們明明就宣告了 128 個空間,但為什麼輸出結果只有 11 個字元?剩下的去哪了呢?正是被 '\0' 擋掉了。'\0' 明確的告訴程式:在我後面的都是垃圾,不要用,因此我們才能正確的輸出。
但是,我們在初始化的時候並沒有把 '\0' 寫出來啊?其實是編譯器會幫我們在字串結尾補上 '\0',所以基本上我們不用擔心忘記加上 '\0' 就會
我們可以利用 sizeof 來驗證 '\0' 的存在:
char str[] = "hello world";
printf("%d\n", sizeof str); // 12
可以看到,str 本身只有 11 個字元,但是佔用的空間是 12 個 byte,證實了有一個看不到的字元被放入了 str。- 輸入字元陣列
char s1[48];
scanf("%s", s1);
printf("%s\n", s1);
char s2[48];
char *s3 = s2; // 相當於 s3 = &s2[0];
scanf("%s", s3);
printf("%s\n", s3);
這裡要注意的有幾點:首先是輸入只有兩種選擇,至於為什麼,多看一下應該很容易理解;另外就是在對字串使用 scanf() 時,後面的引數不用加 &,原因是:1) s1 代表 s1[0] 的位址
2) 因為 s3 指向 s2[0],所以 s3 本身儲存了 s2[0]的位址
最後要注意的是:scanf() 讀字串時遇到空格就會斷開,而如果有剩下的部分,會被留在緩衝區裡等待下一次的 scanf()。另外,scanf() 也會在讀入的字串後補上 '\0'。
如果想要連同空格一起吃入字串的話,可以這麼寫:
char str[128];
fgets(str, 128, stdin);
上述範例中的 fgets() 原本是要從檔案指標中讀取一行字串時使用的函式,一行指的是遇到 '\n' 或 EOF,讀取完後,會將 '\n'(如果有遇到)和 '\0' 放入字串尾。 把 str 傳入第一個參數,就能把讀取結果存入 str 內,這裡在它的第三個參數傳入了 stdin,這是標準輸入(通常是鍵盤)的指標,讓我們可以獲取鍵盤輸入的資料。而第二個參數控制的是讀取進來的字元數(包含 '\0'),不能超過這個值。
留言
張貼留言