# C語言怎樣計算字符串最后一個單詞的長度
在C語言編程中,處理字符串是常見的任務之一。計算字符串中最后一個單詞的長度是一個典型的字符串操作問題,涉及指針操作、循環控制和邊界條件處理。本文將詳細介紹如何用C語言實現這一功能,并提供完整的代碼示例。
## 問題分析
要計算字符串中最后一個單詞的長度,首先需要明確以下幾點:
1. **單詞的定義**:通常指由非空格字符組成的連續序列,以空格或字符串結束符`\0`為分隔。
2. **邊界情況**:字符串可能以空格結尾,或整個字符串為空。
3. **遍歷方向**:從字符串末尾向前遍歷效率更高,可以避免不必要的完整掃描。
## 實現步驟
### 方法一:從后向前遍歷
這是最高效的實現方式,時間復雜度為O(n),空間復雜度為O(1)。
```c
#include <stdio.h>
#include <string.h>
int lastWordLength(const char *str) {
int len = 0;
int i = strlen(str) - 1; // 從字符串末尾開始
// 跳過末尾的空格
while (i >= 0 && str[i] == ' ') {
i--;
}
// 計算最后一個單詞的長度
while (i >= 0 && str[i] != ' ') {
len++;
i--;
}
return len;
}
int main() {
char str[] = "Hello World ";
printf("Last word length: %d\n", lastWordLength(str)); // 輸出5
return 0;
}
雖然可行,但會修改原字符串且效率較低:
#include <stdio.h>
#include <string.h>
int lastWordLengthStrtok(char *str) {
char *token = strtok(str, " ");
char *last = NULL;
while (token != NULL) {
last = token;
token = strtok(NULL, " ");
}
return last ? strlen(last) : 0;
}
跳過末尾空格:
使用while (i >= 0 && str[i] == ' ')
確保從最后一個非空格字符開始計數。
邊界處理:
"fly me to the moon "
應返回4(”moon”)性能優化:
從后向前遍歷比分割字符串或多次調用strlen
更高效。
void testCases() {
struct TestCase {
char *input;
int expected;
} cases[] = {
{"Hello World", 5},
{" fly me to the moon ", 4},
{"luffy is still joyboy", 6},
{"", 0},
{" ", 0},
{"a", 1}
};
for (int i = 0; i < sizeof(cases)/sizeof(cases[0]); i++) {
int result = lastWordLength(cases[i].input);
printf("Test '%s': %s (Expected %d, Got %d)\n",
cases[i].input,
result == cases[i].expected ? "PASS" : "FL",
cases[i].expected,
result);
}
}
未處理末尾空格:
直接反向計數會導致統計到空格。
數組越界:
忘記檢查i >= 0
可能導致訪問非法內存。
空指針問題:
如果傳入NULL指針應添加保護:
if (!str) return 0;
std::string
的find_last_not_of
簡化操作通過從字符串末尾逆向遍歷的方式,可以高效計算出最后一個單詞的長度。關鍵點在于正確處理邊界條件和空格跳過邏輯。該算法在LeetCode等編程題庫中屬于基礎字符串操作題,掌握后對理解指針操作和字符串處理有很大幫助。
提示:實際編程中建議添加輸入驗證,并考慮使用
size_t
代替int
以兼容超長字符串。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。