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

C 語言 ASCII 碼表印刷錯誤修正:unknown character '0xa1' 與 main 缺少返回值

     編輯:C 語言問答

錯誤代碼與訊息

#include 
int main() {
    int a;
    for (a = 33; a <= 126; a = a + 1)
        printf("%d\t%x\t\t%c\n", a, a, a);
}
// 編譯錯誤:
// error C2018: unknown character '0xa1' (x4)
// warning C4508: 'main' : function should return a value; 'void' return type assumed

錯誤 1:unknown character '0xa1'

  • 0xA1 是**全形空白/中文標點**在某些編碼(如 Big5/GBK)中的首位元組。
  • 原代碼中可能混入了**全形空白、全形分號、全形括號、中文引號**等非 ASCII 字元。
  • 編譯器(MSVC)預設以系統預設編碼讀取源檔,遇到非 ASCII 位元組序列報錯。

錯誤 2:main 缺少返回值

  • int main() 承諾返回 int,落脚未寫 return 0;(或其他整數)。
  • C99 起允許省略 return 0;(編譯器隱式插入),但 MSVC 舊版本嚴格要求顯式返回。

修正後代碼(儲存為 UTF-8 無 BOM,純 ASCII 字元)

#include 

int main(void) {
    int a;
    for (a = 33; a <= 126; a++)          // a++ 等價 a = a + 1
        printf("%d\t%x\t\t%c\n", a, a, a);
    return 0;                              // 明確返回
}

關鍵修正點

  1. **源檔編碼設為 UTF-8 (無 BOM)**,或純 ASCII。VS Code 右下角可切換編碼;Notepad++「編碼」→「轉為 UTF-8」。
  2. **刪除所有全形字元**:空白、分號 ;、括號 ()、引號 ""'',改為半形。
  3. 加上 return 0;。
  4. a = a + 1 簡寫為 a++。

編譯器警告等級建議

gcc -Wall -Wextra -Werror -std=c11 -pedantic main.c -o main
cl /W4 /WX /std:c11 main.c

-Werror//WX 將警告視為錯誤,強迫修復所有問題(含缺少返回值)。

延伸:印製完整 ASCII 表(含控制字元說明)

#include 
int main(void) {
    for (int i = 0; i < 128; i++) {
        const char *desc = "";
        if (i < 32 || i == 127) {
            static const char *ctrl[] = {
                "NUL","SOH","STX","ETX","EOT","ENQ","ACK","BEL",
                "BS","HT","LF","VT","FF","CR","SO","SI",
                "DLE","DC1","DC2","DC3","DC4","NAK","SYN","ETB",
                "CAN","EM","SUB","ESC","FS","GS","RS","US"
            };
            desc = (i < 32) ? ctrl[i] : "DEL";
        }
        printf("%3d  0x%02X  %c  %s\n", i, i, (i>=32 && i<127)?i:' ', desc);
    }
    return 0;
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved