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

C 語言查找句子中最長單詞:函數聲明位置導致的編譯錯誤

     編輯:程式設計綜合問答

錯誤現象

代碼邏輯意圖正確,但編譯報錯。原代碼在 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');
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved