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

OJ 題目解析:Reverse Text 字串反轉輸出

     編輯:關於C

題目需求

  • 讀取整數 n,表示後續 n 行文字。
  • 對每一行,將字元順序完全反轉後輸出。
  • 行與行之間以換行分隔,最後一行無額外空行。

完整解法

#include <stdio.h>
#include <string.h>

int main(void)
{
    int num, i, len;
    char line[70];          // 題目限制行長 ≤ 70

    scanf("%d", &num);
    getchar();              // 吸收 scanf 留下的換行

    while (num--) {
        fgets(line, sizeof(line), stdin);  // 安全讀取整行
        // 移除 fgets 可能讀入的尾隨換行
        len = strlen(line);
        if (len > 0 && line[len - 1] == '\n')
            line[--len] = '\0';

        // 反序輸出
        for (i = len - 1; i >= 0; i--)
            putchar(line[i]);

        if (num > 0) putchar('\n');  // 非最後一行補換行
    }
    return 0;
}

關鍵點解析

  1. getchar() 清除緩衝:scanf("%d") 讀完整數後,標準輸入仍殘留換行符,必須消耗掉,否則首次 fgets 會讀到空行。
  2. 使用 fgets 而非 gets:gets 不檢查緩衝區大小,極易造成緩衝區溢位,已從 C11 標準移除。fgets 安全且保留換行,方便後續處理。
  3. 手動移除換行:fgets 會將 \n 存入緩衝區(若空間足夠),反轉前必須去除,否則換行會跑到行首。
  4. 迴圈條件 i >= 0:i 為 int 有號整數,避免 size_t 無號下溢導致無限迴圈。
  5. 輸出格式控制:僅在非最後一行輸出 \n,符合「最後一塊輸出後無空行」要求。

替代方案:就地反轉

// 就地反轉字串再輸出
for (i = 0, j = len - 1; i < j; i++, j--) {
    char tmp = line[i];
    line[i] = line[j];
    line[j] = tmp;
}
printf("%s", line);

若需保留原字串或後續仍需使用,就地反轉需額外複製;直接反序輸出更省記憶體且簡潔。

常見錯誤與避坑

  • 使用 gets → 緩衝區溢位風險。
  • 忘記 getchar() → 首行讀空。
  • 未移除 fgets 讀入的 \n → 輸出首字元為換行。
  • 最後一行多輸出空行 → 格式錯誤(Presentation Error)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved