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

OJ題解:首字母大寫 - 英文句子單詞首字母大寫

     編輯:關於C語言

題目要求

輸入多行英文句子(每行 ≤100字元),將每個單詞第一個字母轉為大寫,其餘保持不變。

演算法:狀態機

用 flag 標記「下一字元是否為單詞開頭」:

  • 初始 flag=1 (行首視為單詞開頭)
  • 遇到空格 → flag=1
  • 遇到非空格且 flag=1 → 轉大寫,flag=0
  • 遇到非空格且 flag=0 → 不變

完整原始碼

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main() {
    char s[101];
    while (fgets(s, sizeof(s), stdin)) {
        int flag = 1;
        for (int i = 0; s[i]; i++) {
            if (flag && islower(s[i])) s[i] = toupper(s[i]);
            flag = (s[i] == ' ');
        }
        printf("%s", s);  // fgets保留換行
    }
    return 0;
}

改進點

  • 用 fgets 替代不安全的 gets
  • 用 islower/toupper 替代硬編碼 -32,支援非ASCII環境
  • 邏輯簡化:flag = (s[i]==' ') 一行搞定狀態轉移

範例

輸入: i like acm
處理: i→I, 空格→flag=1, l→L, 空格→flag=1, a→A
輸出: I Like Acm ✓

邊界情況

  • 多重空格:連續空格會重複設 flag=1,下一非空格正確大寫
  • 首字母已為大寫:islower 判斷避免重複轉換
  • 標點符號:視為單詞一部分,不觸發 flag (題目隱含單詞以空格分隔)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved