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

C語言字符串處理全攻略:從字面量到安全輸入輸出

     編輯:關於C語言

C 語言無內建字符串類型,以**以空字符 \0 結尾的字符數組**模擬。本文系統梳理字符串字面量存儲、變量聲明初始化、數組與指針差異、輸入輸出函數選型與安全實踐。

一、字符串字面量:唯讀數組

  • 編譯器在只讀數據段分配 n+1 字節 (n 為可見字符數),末尾補 \0
  • char *p = "abc"; 使 p 指向字面量首地址,**非拷貝**
  • 嚴禁修改: p[0] = 'X'; → 未定義行為 (段錯誤/總線錯誤)

二、字符串變量:可修改數組

#define STR_LEN 80
char str[STR_LEN + 1];          // 預留 \0 位置
char date1[8] = "June 14";      // 精確容納 7 字符 + \0
char date2[9] = "June 14";      // 餘下自動填 0
char date3[] = "June 14";       // 編譯器自動計長度 (8)

三、字符數組 vs 字符指針:核心差異

特性char arr[] = "text"char *ptr = "text"
存儲位置棧/數據段 (可寫)指針在棧,指向只讀段
可修改性✅ 任意修改元素❌ 修改觸發 UB
指針屬性數組名,常量指針 (不可改指向)變量,可重新指向其他字符串
sizeof數組總字節數 (含 \0)指針大小 (4/8 字節)

需可修改字符串 → 必須用數組。指針變量需先指向有效數組:char buf[100], *p = buf;

四、輸出函數

  • printf("%s", str); 通用,支持精度 %.6s 限制長度
  • puts(str); 簡單,**自動換行**,無格式化開銷

五、輸入函數:安全性排序

安全讀行範例

int read_line(char *buf, int n) {
    int i = 0, ch;
    while ((ch = getchar()) != '\n' && ch != EOF) {
        if (i < n - 1) buf[i++] = ch;
    }
    buf[i] = '\0';
    return i;
}

六、字符串處理函數速查

  • 長度:strlen (不含 \0)
  • 拷貝:strcpy (不安全) / strncpy (不保證 \0) / snprintf (推薦)
  • 拼接:strcat / strncat / snprintf
  • 比較:strcmp / strncmp / strcasecmp (POSIX)
  • 查找:strchr / strstr / strtok_r (線程安全分割)

黃金法則: **永遠使用帶長度限制的版本 (n 後綴) 或 snprintf**,並確保目標緩衝區足夠大。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
函數行為風險建議
scanf("%s", buf)跳過空白,讀至空白,**無長度限制**💥 緩衝區溢出❌ 禁用
gets(buf)讀整行 (含空格),**無長度限制**💥💥 溢出溫床,C11 已移除❌❌ 絕對禁用
fgets(buf, n, stdin)讀至換行或 n-1 字符,**保留 \n**需手動去 \n✅ 推薦
自寫 read_line()逐字符 getchar() 至 \n,自動截斷補 \0完全可控✅ 教學/特殊需求