代碼邏輯意圖正確,但編譯報錯。原代碼在 main 函數內部聲明函數原型:
int main() {
void f(char s[]); // 錯誤位置
char s[100];
// ...
}
將函數聲明移至 main 函數之外(全局作用域),或者在文件頂部統一聲明所有函數原型。這是 C 語言規範要求:函數聲明不能嵌套在另一個函數內部(雖然某些舊編譯器作為擴展支持,但標準 C 不允許)。
#include <stdio.h>
#include <string.h> // 可能需要
// 全局聲明
void f(char s[]);
int main() {
char s[100];
printf("enter a sentence:");
// 注意:scanf("%s") 只讀取到空格,無法讀取整行句子
// 建議使用 fgets(s, sizeof(s), stdin);
fgets(s, sizeof(s), stdin);
f(s);
return 0;
}
void f(char s[]) {
// 實現查找最長單詞邏輯...
// 原代碼邏輯有缺陷(sum 累加錯誤、單詞分割未處理標點等),
// 建議重寫:遍歷字符串,用變量記錄當前單詞長度和最大長度及起始位置。
}
void f(char s[]) {
int maxLen = 0, maxStart = 0;
int curLen = 0, curStart = 0;
int i = 0;
while (s[i] != '\0') {
if (s[i] != ' ' && s[i] != '\t' && s[i] != '\n') { // 非空白字符
if (curLen == 0) curStart = i;
curLen++;
} else { // 遇到分隔符
if (curLen > maxLen) {
maxLen = curLen;
maxStart = curStart;
}
curLen = 0;
}
i++;
}
// 處理最後一個單詞(如果句子不以空格結尾)
if (curLen > maxLen) {
maxLen = curLen;
maxStart = curStart;
}
// 輸出最長單詞
for (i = 0; i < maxLen; i++) {
putchar(s[maxStart + i]);
}
putchar('\n');
}