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

C語言字串大小寫轉換與逆序輸出:gets 危險性與 fgets 安全替代方案

     編輯:C 語言問答

題目需求

輸入一行字串,大寫轉小寫,逆序輸出。

安全版實作 (拒絕 gets)


#include 
#include 
#include 

int main() {
    char line[100];
    printf("輸入一行字串: ");
    if (!fgets(line, sizeof(line), stdin)) return 1;

    // 移除 fgets 保留的換行符
    char *nl = strchr(line, '\n');
    if (nl) *nl = '\0';

    // 逆序輸出並轉小寫
    for (int i = strlen(line) - 1; i >= 0; i--) {
        putchar(tolower((unsigned char)line[i]));
    }
    putchar('\n');
    return 0;
}

為什麼不用 gets?

  • C11 已移除,C99 標記棄用。
  • 無緩衝區長度參數,輸入超過陣列大小必導致緩衝區溢位,是經典安全漏洞來源。
  • 替代品:fgets(buf, sizeof(buf), stdin) (保留換行) 或 getline() (POSIX, 自動擴充)。

大小寫轉換細節

  • tolower/toupper 參數為 int,需轉型 (unsigned char) 避免負值 (非 ASCII 字元) 導致未定義行為。
  • 僅影響 ASCII 字母,其他字元原樣輸出。

原始碼錯誤分析


// 原始碼問題
do { scanf("%c", &a[n]); ... } while (a[n-1] != '\n');
// 1. scanf("%c") 讀取空白/換行,極難控制
// 2. a[n-1] 邏輯混亂,n 未正確增長
// 3. 輸出迴圈條件 n>=0 但 n 未初始化
// 4. printf("%c",) 缺少參數
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved