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;
}
getchar() 清除緩衝:scanf("%d") 讀完整數後,標準輸入仍殘留換行符,必須消耗掉,否則首次 fgets 會讀到空行。fgets 而非 gets:gets 不檢查緩衝區大小,極易造成緩衝區溢位,已從 C11 標準移除。fgets 安全且保留換行,方便後續處理。fgets 會將 \n 存入緩衝區(若空間足夠),反轉前必須去除,否則換行會跑到行首。i >= 0:i 為 int 有號整數,避免 size_t 無號下溢導致無限迴圈。\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 → 輸出首字元為換行。