經典字符串處理題:讀入一行以句號結尾的文本,單詞間可能有多個空格,輸出每個單詞長度(含標點符號),長度間單空格分隔,行末無空格。
'.' 結尾。句號不計入最後單詞長度。"it's" 長度 4)。gets 或 fgets)。count 計數當前單詞長度。count > 0:輸出長度 (首個無前導空格,後續前加空格),count=0。count++,繼續遍歷。
#include
#define MAX_LEN 1000
int main() {
char line[MAX_LEN];
// 安全讀取一行 (fgets 保留 \n,gets 不安全已棄用)
if (!fgets(line, MAX_LEN, stdin)) return 0;
int count = 0;
int first = 1; // 首個單詞標記
for (int i = 0; line[i]; i++) {
char c = line[i];
if (c == ' ' || c == '.') {
if (count > 0) { // 完成一個單詞
if (first) {
printf("%d", count);
first = 0;
} else {
printf(" %d", count);
}
count = 0;
}
if (c == '.') { // 句號結束
printf("\n");
break;
}
// 空格:外層循環會繼續,這裡不需額外跳過,
// 因為下一輪遇到空格 count==0 不會輸出,自然跳過連續空格
} else {
count++; // 普通字符計數
}
}
return 0;
}
| 點 | 處理 |
|---|---|
| 讀取函數 | 用 fgets 替代危險的 gets,指定緩衝區大小防溢出 |
| 連續空格 | 遇到空格時 count==0 不輸出,循環自然跳過,無需額外 while |
| 句號結束 | 檢測到 '.' 且 count>0 輸出後,打印換行 break 退出 |
| 首個輸出無前導空格 | first 標記控制 printf 格式 |
| 單詞包含標點 | 非空格、非句號字符均計入長度 (it's→4, hello!→6) |
| 輸入 | 輸出 | 說明 |
|---|---|---|
It's great to see you here. | 4 5 2 3 3 4 | 基本用例 |
It's great. | 4 5 | 多空格跳過 |
Hello world . | 5 5 | 首尾空格忽略 |
a b c. | 1 1 1 | 單字符單詞 |
. | (空行換行) | 無單詞 |
\t、換行 \n、標點符號作為分隔符 → 用 strtok 或狀態機處理。mbrlen/ICU庫)。scanf("%s") 讀取:遇到空格停止,**無法讀取整行含空格文本**。gets 無緩衝區保護,**嚴禁使用** (C11 已移除)。這道題考察字符串遍歷、狀態管理 (單詞內/外)、邊界條件 (首尾空格、句號)、輸出格式控制。掌握「單遍歷、計數器、標記位、即時輸出」模式,可解決大多數字符串分詞統計問題。