首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言入門

C 語言字串完全指南:初始化、二維陣列、常用函式與輸入輸出陷阱

     編輯:C 語言入門

字串本質:以 '\0' 結尾的字元陣列

C 無內建字串型別,字串實為 char[] 且必須以空字元 '\0' (ASCII 0) 結尾。
char s[] = "hello"; 實際佔 6 位元組:h e l l o \0。

初始化方式總覽

寫法合法性備註
char a[6] = {'h','e','l','l','o','\0'};✅手動加 '\0'
char b[] = "hello";✅編譯器自動加 '\0',長度 6
char c[10] = "hi";✅剩餘補 0
char d[5] = "hello";❌空間不足(需 6)
char e[5] = {'h','e','l','l','o'};⚠️缺 '\0',非標準字串,strlen 會越界

字串陣列(二維/三維)

// 15 位學生,姓名上限 19 字元 + '\0'
char names[15][20];

// 初始化
char classA[2][10] = { "Jay", "Jim" };
char classB[2][2][10] = { { "Jay", "Jim" }, { "Tom", "Bob" } };

核心庫函式速查

函式原型行為陷阱
strlensize_t strlen(const char *s)返回 '\0' 前字元數不含 '\0';傳非字串會崩潰
strcpychar *strcpy(char *dest, const char *src)複製含 '\0'dest 必須足夠大,否則緩衝區溢位
strcatchar *strcat(char *dest, const char *src)拼接至 dest 末尾dest 需預留空間
strcmpint strcmp(const char *s1, const char *s2)逐字元比較 ASCII 差值返回 0 表相等;>0 s1大;<0 s1小
putsint puts(const char *s)輸出字串並自動換行僅能輸出單一字串
getschar *gets(char *s)讀整行含空格,遇 '\n' 止已移除 (C11),極易溢位,禁用
scanfscanf("%s", s)讀單詞(跳過空白,遇空白止)無法讀含空格字串;需防溢位 %19s

輸入函式選擇指南

  1. 單詞:scanf("%19s", buf)(限寬防溢位)
  2. 整行(含空格):fgets(buf, sizeof(buf), stdin) → 手動移除尾部 '\n'
  3. 混合使用:scanf 後殘留 '\n' 會導致 fgets 讀到空行,需先清緩衝區。

字元 I/O

putchar('A');       // 輸出單字元
int ch = getchar(); // 讀單字元,含空格、Tab、換行
// 注意:getchar 讀到 '\n' 後需再按一次 Enter 才算輸入結束

常見錯誤與修正

錯誤代碼問題修正
char *p = "abc"; p[0] = 'X';修改字串常量 → 段錯誤char p[] = "abc"; p[0] = 'X';
char a[10]; a = "hi";陣列名為常量指標,不可賦值strcpy(a, "hi");
gets(buf);緩衝區溢位風險fgets(buf, sizeof(buf), stdin);
scanf("%s", buf); // 輸入超長緩衝區溢位scanf("%19s", buf);

實戰片段:安全讀取一行並去除換行

char line[256];
if (fgets(line, sizeof(line), stdin)) {
    size_t len = strlen(line);
    if (len > 0 && line[len-1] == '\n') line[len-1] = '\0';
    // line 現在是不含換行的純字串
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved