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

C語言字串處理:將每個單字首字母轉大寫完整解法

     編輯:C 語言問答

題目需求

輸入一行文字,將其中每個單字的首字母由小寫改為大寫。單字間以一個以上空白分隔。

核心演算法邏輯

  1. 讀取整行輸入(含空白),使用 `fgets()` 或 `gets()`(不建議,有緩衝區溢位風險)。
  2. 將字串第一個非空白字元轉大寫(若為小寫字母)。
  3. 遍歷字串,**偵測「空白後接非空白」的位置**,將該非空白字元轉大寫。
  4. 輸出修改後的字串。

參考程式碼(含安全輸入)

#include <stdio.h>
#include <ctype.h>   // 提供 toupper(), isspace()
#include <string.h>

#define MAX_LEN 1000

int main() {
    char str[MAX_LEN];
    
    printf("請輸入一行文字: ");
    if (fgets(str, MAX_LEN, stdin) == NULL) {
        return 1;
    }
    // 移除 fgets 保留的換行符
    str[strcspn(str, "\n")] = '\0';
    
    // 處理第一個字元
    if (str[0] != '\0' && islower((unsigned char)str[0])) {
        str[0] = toupper((unsigned char)str[0]);
    }
    
    // 遍歷偵測「空白後的首字母」
    for (size_t i = 1; str[i] != '\0'; i++) {
        if (isspace((unsigned char)str[i-1]) && !isspace((unsigned char)str[i]) && islower((unsigned char)str[i])) {
            str[i] = toupper((unsigned char)str[i]);
        }
    }
    
    printf("轉換結果: %s\n", str);
    return 0;
}

關鍵函式與技巧

  • ctype.h 函式:`islower()`、`toupper()`、`isspace()` 處理字元分類與轉換,**參數需轉為 `unsigned char` 避免未定義行為**。
  • fgets():安全讀取整行,含空白,自動防止緩衝區溢位。
  • strcspn(str, "\n"):快速定位換行符位置並移除。
  • 索引從 1 開始,檢查 `str[i-1]` 是空白且 `str[i]` 非空白,即為單字開頭。

執行範例

請輸入一行文字: hello   world  c programming
轉換結果: Hello   World  C Programming

多重空白保持不變,每個單字首字母正確大寫。

常見錯誤與改進

  • **直接用 `gets()`** → 不安全,已從 C11 移除,嚴禁使用。
  • **只檢查 `str[i] == ' '`** → 忽略 Tab、換行等空白字元,應用 `isspace()`。
  • **修改字串字面常數** → `char *p = "hello"; p[0] = 'H';` 導致未定義行為,必須用陣列 `char str[] = "hello";`。
  • **非 ASCII 環境** → `toupper()` 依賴 locale,處理中文等非 ASCII 字元需用寬字元或 ICU 庫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved