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

C語言結構體定義與變量聲明順序錯誤修正

     編輯:C 語言問答

結構體聲明語法規則

錯誤代碼:


struct emp s[10]  // 錯誤:結構體類型 emp 尚未定義
{
    char name[10];
    float jbg, fdg, zc;
};

正確順序:先定義類型,再聲明變量


// 方式 1:先定義結構體類型
struct emp {
    char name[10];
    float jbg, fdg, zc;
};
struct emp s[10];  // 聲明變量

// 方式 2:定義同時聲明 (推薦)
struct emp {
    char name[10];
    float jbg, fdg, zc;
} s[10];

// 方式 3:typedef 簡化
typedef struct {
    char name[10];
    float jbg, fdg, zc;
} Emp;
Emp s[10];

編譯器處理流程

  1. 遇到 struct emp s[10] 時,嘗試查找 emp 標籤對應的結構體定義
  2. 若未找到 (因定義在後),報錯:「未知類型 emp」或「語法錯誤」
  3. 將定義移至聲明前,編譯器先建立類型資訊,後續聲明即可正常解析

完整修正代碼


#include 

struct Emp {
    char name[10];
    float jbg, fdg, zc;
};

int main() {
    struct Emp s[10];
    int n, i;
    printf("n="); scanf("%d", &n);
    for (i = 0; i < n; i++)
        scanf("%s %f %f %f", s[i].name, &s[i].jbg, &s[i].fdg, &s[i].zc);
    for (i = 0; i < n; i++)
        printf("%5s 實發工資:%7.2f\n", s[i].name, s[i].jbg + s[i].fdg - s[i].zc);
    return 0;
}

補充:scanf 格式串修正

原代碼 scanf("%s%f%f%f", ...) 缺少空格分隔符,若輸入 Tom 1000 200 300 會因無分隔符導致解析錯誤。建議 scanf("%s %f %f %f", ...)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved