
- C程式設計教程
- C語言 - 首頁
- C語言基礎
- C語言 - 概述
- C語言 - 特性
- C語言 - 歷史
- C語言 - 環境搭建
- C語言 - 程式結構
- C語言 - Hello World
- C語言 - 編譯過程
- C語言 - 註釋
- C語言 - 詞法單元
- C語言 - 關鍵字
- C語言 - 識別符號
- C語言 - 使用者輸入
- C語言 - 基本語法
- C語言 - 資料型別
- C語言 - 變數
- C語言 - 整數提升
- C語言 - 型別轉換
- C語言 - 型別強制轉換
- C語言 - 布林值
- C語言中的常量和字面量
- C語言 - 常量
- C語言 - 字面量
- C語言 - 轉義序列
- C語言 - 格式說明符
- C語言中的運算子
- C語言 - 運算子
- C語言 - 算術運算子
- C語言 - 關係運算符
- C語言 - 邏輯運算子
- C語言 - 位運算子
- C語言 - 賦值運算子
- C語言 - 一元運算子
- C語言 - 自增和自減運算子
- C語言 - 三元運算子
- C語言 - sizeof運算子
- C語言 - 運算子優先順序
- C語言 - 其他運算子
- C語言中的決策
- C語言 - 決策
- C語言 - if語句
- C語言 - if...else語句
- C語言 - 巢狀if語句
- C語言 - switch語句
- C語言 - 巢狀switch語句
- C語言中的迴圈
- C語言 - 迴圈
- C語言 - while迴圈
- C語言 - for迴圈
- C語言 - do...while迴圈
- C語言 - 巢狀迴圈
- C語言 - 死迴圈
- C語言 - break語句
- C語言 - continue語句
- C語言 - goto語句
- C語言中的函式
- C語言 - 函式
- C語言 - 主函式
- C語言 - 按值呼叫函式
- C語言 - 按引用呼叫函式
- C語言 - 巢狀函式
- C語言 - 可變引數函式
- C語言 - 使用者自定義函式
- C語言 - 回撥函式
- C語言 - 返回語句
- C語言 - 遞迴
- C語言中的作用域規則
- C語言 - 作用域規則
- C語言 - 靜態變數
- C語言 - 全域性變數
- C語言中的陣列
- C語言 - 陣列
- C語言 - 陣列的特性
- C語言 - 多維陣列
- C語言 - 將陣列傳遞給函式
- C語言 - 從函式返回陣列
- C語言 - 變長陣列
- C語言中的指標
- C語言 - 指標
- C語言 - 指標和陣列
- C語言 - 指標的應用
- C語言 - 指標運算
- C語言 - 指標陣列
- C語言 - 指向指標的指標
- C語言 - 將指標傳遞給函式
- C語言 - 從函式返回指標
- C語言 - 函式指標
- C語言 - 指向陣列的指標
- C語言 - 指向結構體的指標
- C語言 - 指標鏈
- C語言 - 指標與陣列的區別
- C語言 - 字元指標和函式
- C語言 - 空指標
- C語言 - void指標
- C語言 - 懸空指標
- C語言 - 解引用指標
- C語言 - 近指標、遠指標和巨大指標
- C語言 - 指標陣列的初始化
- C語言 - 指標與多維陣列的區別
- C語言字串
- C語言 - 字串
- C語言 - 字串陣列
- C語言 - 特殊字元
- C語言結構體和聯合體
- C語言 - 結構體
- C語言 - 結構體和函式
- C語言 - 結構體陣列
- C語言 - 自引用結構體
- C語言 - 查詢表
- C語言 - 點(.)運算子
- C語言 - 列舉 (enum)
- C語言 - 結構體填充和打包
- C語言 - 巢狀結構體
- C語言 - 匿名結構體和聯合體
- C語言 - 聯合體
- C語言 - 位域
- C語言 - typedef
- C語言中的檔案處理
- C語言 - 輸入輸出
- C語言 - 檔案I/O(檔案處理)
- C語言預處理器
- C語言 - 預處理器
- C語言 - 預處理指令
- C語言 - 預處理器運算子
- C語言 - 宏
- C語言 - 標頭檔案
- C語言中的記憶體管理
- C語言 - 記憶體管理
- C語言 - 記憶體地址
- C語言 - 儲存類別
- 其他主題
- C語言 - 錯誤處理
- C語言 - 可變引數
- C語言 - 命令執行
- C語言 - 數學函式
- C語言 - static關鍵字
- C語言 - 隨機數生成
- C語言 - 命令列引數
- C程式設計資源
- C語言 - 問答
- C語言 - 快速指南
- C語言 - 速查表
- C語言 - 有用資源
- C語言 - 討論
C語言字串
C語言字串
C語言中的字串是由字元型資料組成的一維陣列,陣列的最後一個字元是“空字元”,用'\0'表示。因此,C語言中的字串可以定義為以空字元結尾的字元型值序列。
在C語言中建立字串
讓我們建立一個字串“Hello”。它包含五個字元型值。在C語言中,字元型的字面量表示使用單引號——例如'H'。這五個字母用單引號括起來,後面跟著一個用'\0'表示的空字元,並賦值給一個字元型陣列。陣列的大小是五個字元加一個空字元——六個。
示例
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
不指定大小初始化字串
C語言允許您在不宣告大小的情況下初始化陣列,在這種情況下,編譯器會自動確定陣列的大小。
示例
char greeting[] = {'H', 'e', 'l', 'l', 'o', '\0'};
在記憶體中建立的陣列可以示意性地顯示如下:

如果字串沒有以"\0"結尾,則會導致不可預測的行為。
注意:字串的長度不包括空字元。strlen()庫函式返回此字串的長度為5。
遍歷字串
您可以使用for迴圈或任何其他迴圈語句遍歷字串(字元陣列)以訪問和操作字串的每個字元。
示例
在下面的示例中,我們正在列印字串的字元。
#include <stdio.h> #include <string.h> int main (){ char greeting[] = {'H', 'e', 'l', 'l', 'o', '\0'}; for (int i = 0; i < 5; i++) { printf("%c", greeting[i]); } return 0; }
輸出
它將產生以下輸出:
Hello
列印字串(使用%s格式說明符)
C語言提供了一個格式說明符“%s”,當您使用printf()或fprintf()函式時,它用於列印字串。
示例
“%s”說明符告訴函式迭代陣列,直到遇到空終止符(\0)並列印每個字元。這有效地列印了字元陣列表示的整個字串,而無需使用迴圈。
#include <stdio.h> int main (){ char greeting[] = {'H', 'e', 'l', 'l', 'o', '\0'}; printf("Greeting message: %s\n", greeting ); return 0; }
輸出
它將產生以下輸出:
Greeting message: Hello
您可以宣告一個超大的陣列並賦值較少的字元,C編譯器對此沒有問題。但是,如果大小小於初始化中的字元數,則輸出中可能會出現垃圾值。
char greeting[3] = {'H', 'e', 'l', 'l', 'o', '\0'}; printf("%s", greeting);
使用雙引號構造字串
與其構造單個字元值用單引號括起來的char陣列,並使用“\0”作為最後一個元素,C語言允許您透過將字元用雙引號括起來來構造字串。這種初始化字串的方法更方便,因為編譯器會自動新增“\0”作為最後一個字元。
示例
#include <stdio.h> int main() { // Creating string char greeting[] = "Hello World"; // Printing string printf("%s\n", greeting); return 0; }
輸出
它將產生以下輸出:
Hello World
使用scanf()輸入字串
宣告以空字元結尾的字串,如果您想要求使用者輸入字串,則會造成困難。您可以藉助for迴圈,一次接受一個字元並將其儲存在陣列的每個下標中:
語法
for(i = 0; i < 6; i++){ scanf("%c", &greeting[i]); } greeting[i] = '\0';
示例
在下面的示例中,您可以使用scanf()函式輸入字串,在輸入特定字元(下面的示例中為5個)後,我們分配空值('\0')以終止字串。
printf("Starting typing... "); for (i = 0; i < 5; i++) { scanf("%c", &greeting[i]); } // Assign NULL manually greeting[i] = '\0'; // Printing the string printf("Value of greeting: %s\n", greeting);
輸出
執行程式碼並檢查其輸出:
Starting typing... Hello Value of greeting: Hello
示例
不可能輸入"\0"(空字串),因為它是非列印字元。為了克服這個問題,在scanf()語句中使用了"%s"格式說明符:
#include <stdio.h> #include <string.h> int main (){ char greeting[10]; printf("Enter a string:\n"); scanf("%s", greeting); printf("You entered: \n"); printf("%s", greeting); return 0; }
輸出
執行程式碼並檢查其輸出:
Enter a string: Hello You entered: Hello
注意:如果陣列的大小小於輸入字串的長度,則可能會導致垃圾資料、資料損壞等情況。
包含空格的字串輸入
scanf("%s")讀取字元,直到遇到空格(空格、製表符、換行符等)或EOF。因此,如果您嘗試輸入包含多個單詞(用空格分隔)的字串,則C程式會將第一個空格之前的字元作為字串的輸入。
示例
看看下面的例子:
#include <stdio.h> #include <string.h> int main (){ char greeting[20]; printf("Enter a string:\n"); scanf("%s", greeting); printf("You entered: \n"); printf("%s", greeting); return 0; }
輸出
執行程式碼並檢查其輸出:
Enter a string: Hello World! You entered: Hello
使用gets()和fgets()函式輸入字串
要接受包含空格的字串輸入,我們應該使用gets()函式。它被稱為非格式化控制檯輸入函式,在"stdio.h"標頭檔案中定義。
示例:使用gets()函式輸入字串
看看下面的例子:
#include <stdio.h> #include <string.h> int main(){ char name[20]; printf("Enter a name:\n"); gets(name); printf("You entered: \n"); printf("%s", name); return 0; }
輸出
執行程式碼並檢查其輸出:
Enter a name: Sachin Tendulkar You entered: Sachin Tendulkar
在較新的C版本中,gets()已被棄用。它是一個潛在的危險函式,因為它不執行邊界檢查,可能會導致緩衝區溢位。
建議改用fgets()函式。
fgets(char arr[], size, stream);
fgets()函式可用於從任何輸入流(例如stdin(鍵盤)或FILE(檔案流))接受輸入。
示例:使用fgets()函式輸入字串
下面的程式使用fgets()並從使用者處接受多詞輸入。
#include <stdio.h> #include <string.h> int main(){ char name[20]; printf("Enter a name:\n"); fgets(name, sizeof(name), stdin); printf("You entered: \n"); printf("%s", name); return 0; }
輸出
執行程式碼並檢查其輸出:
Enter a name: Virat Kohli You entered: Virat Kohli
示例:使用scanf("%[^\n]s")輸入字串
您也可以使用scanf("%[^\n]s")作為替代方案。它讀取字元,直到遇到換行符("\n")。
#include <stdio.h> #include <string.h> int main (){ char name[20]; printf("Enter a name: \n"); scanf("%[^\n]s", name); printf("You entered \n"); printf("%s", name); return 0; }
輸出
執行程式碼並檢查其輸出:
Enter a name: Zaheer Khan You entered Zaheer Khan
使用puts()和fputs()函式列印字串
我們一直在使用帶有%s說明符的printf()函式來列印字串。我們也可以使用puts()函式(在C11和C17版本中已棄用)或fputs()函式作為替代方案。
示例
看看下面的例子:
#include <stdio.h> #include <string.h> int main (){ char name[20] = "Rakesh Sharma"; printf("With puts(): \n"); puts(name); printf("With fputs(): \n"); fputs(name, stdout); return 0; }
輸出
執行程式碼並檢查其輸出:
With puts(): Harbhajan Singh With fputs(): Harbhajan Singh