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

C語言字符與字符串完全指南:定義、輸入輸出、庫函數與類型轉換

     編輯:關於C語言

前言:字符數組即字符串的本質

在 C 語言中,沒有專屬的字符串類型。**字符串本質上是以空字符 `\0` 結尾的字符數組**。掌握字符與字符串的操作,是處理文本數據的基石。本文系統梳理定義方式、輸入輸出函數、標準庫函數及類型轉換技巧。

一、 定義與初始化

1.1 字符數組(手動添加結尾)

char arr[] = {'h', 'e', 'l', 'l', 'o', '\0'};

需手動添加 `\0`,編譯器不會自動補全。

1.2 字符串字面值(編譯器自動補 `\0`)

char arr1[] = "HELLO"; // 等價於 {'H','E','L','L','O','\0'}

雙引號語法糖自動在末尾追加 `\0`,長度為字符數 + 1。

二、 輸入與輸出:多樣化的工具箱

2.1 通用格式化 I/O:`scanf` / `printf`

同一維數組用法,`%s` 讀取/輸出至空白字符或 `\0`。

2.2 字符級專用 I/O:`getchar` / `putchar`

單字符讀寫,適合逐字符處理邏輯。示例:讀取一行並回顯。

char buf[1000];
int i = 0;
char ch;
while ((ch = getchar()) != '\n') {
    buf[i++] = ch;
}
buf[i] = '\0';
for (int j = 0; buf[j]; j++) putchar(buf[j]);
putchar('\n');

2.3 字符串級專用 I/O:`gets` / `puts` (注意:`gets` 不安全,現代代碼請用 `fgets`)

char str[100];
gets(str);  // 讀取整行(含空格),遇換行符停止並替換為\0
puts(str);  // 輸出字符串並自動換行

三、 字符串核心庫函數 <string.h>

函數功能關鍵注意點
strcpy(dest, src)複製字符串dest 空間必須 ≥ src 長度 + 1,否則溢出
strcat(dest, src)拼接字符串dest 需有足夠空間容納拼接結果
strlen(str)計算長度返回不含 `\0` 的字符數,類型 `size_t`
strcmp(s1, s2)比較字符串按 ASCII 碼逐字符比較,相等返回 0

四、 字符分類與轉換 <ctype.h>

常用於單字符判斷與大小寫轉換:

  • isalpha(c)、isdigit(c)、isupper(c)、islower(c)
  • toupper(c)、tolower(c)

實戰:字符串大小寫反轉

char line[100];
gets(line);
for (int i = 0; line[i]; i++) {
    char c = line[i];
    if (isupper(c)) putchar(tolower(c));
    else putchar(toupper(c));
}
putchar('\n');

五、 字符串與數值互轉 <stdlib.h>

5.1 字符串 → 數值

char *s = "11.52";
double d = atof(s);  // 11.52
int i = atoi(s);     // 11 (截斷小數)

5.2 數值 → 字符串:`sprintf` 格式化輸出

int num = 1000;
char buf[100];
sprintf(buf, "%d", num);      // "1000"
sprintf(buf, "%10s", "asdf"); // 寬度 10 右對齊

六、 總結與最佳實踐

  1. **時刻記住 `\0`**:它是字符串操作的邊界哨兵。
  2. **拒絕 `gets`**:使用 `fgets(buf, sizeof(buf), stdin)` 防止緩衝區溢出。
  3. **目標緩衝區足夠大**:`strcpy`/`strcat`/`sprintf` 目的地空間必須充足。
  4. **善用標準庫**:手寫字符串處理易出錯,`string.h`/`ctype.h`/`stdlib.h` 提供經過優化的實現。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved