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

PAT 基礎級 1009 說反話:句子單詞逆序輸出

     編輯:關於C語言

題目描述

輸入一行英文句子(長度 ≤ 80,單詞間單空格分隔),將單詞順序逆序輸出,單詞內部字符順序不變。

解題思路

  • 讀取整行輸入(含空格),使用 fgets 或 gets(注意安全性)
  • 按空格分割單詞,存入二維字符數組或指針數組
  • 從最後一個單詞向前輸出,單詞間加空格,最後換行

標準 C 實現(使用二維數組)

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

int main(void) {
    char line[81];
    char words[41][81]; // 最多 40 個單詞(單字符+空格),每詞長 ≤ 80
    int word_count = 0;
    int len, i, j = 0;

    fgets(line, sizeof(line), stdin);
    len = strlen(line);
    if (line[len-1] == '\n') line[--len] = '\0'; // 去除換行符

    // 分割單詞
    for (i = 0; i <= len; i++) {
        if (line[i] == ' ' || line[i] == '\0') {
            words[word_count][j] = '\0';
            word_count++;
            j = 0;
        } else {
            words[word_count][j++] = line[i];
        }
    }

    // 逆序輸出
    for (i = word_count - 1; i >= 0; i--) {
        printf("%s", words[i]);
        if (i > 0) printf(" ");
    }
    printf("\n");
    return 0;
}

進階版:指針數組避免複製字符串

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

int main(void) {
    char line[81];
    char *words[41];
    int count = 0;

    fgets(line, sizeof(line), stdin);
    line[strcspn(line, "\n")] = '\0'; // 去除換行

    // strtok 分割,直接指向原字符串
    char *token = strtok(line, " ");
    while (token && count < 41) {
        words[count++] = token;
        token = strtok(NULL, " ");
    }

    for (int i = count - 1; i >= 0; i--) {
        printf("%s%c", words[i], i ? ' ' : '\n');
    }
    return 0;
}

關於局部變量數組亂碼的說明

原作者發現將 words 定義為局部變量時在某些 IDE 中輸出亂碼,但提交 PAT 均通過。原因可能是:

  • 棧上大數組未顯式初始化,殘留垃圾數據干擾 strtok 或手動分割邏輯
  • 部分編譯器對大棧數組優化不同,導致未初始化內存行為差異
  • 最佳實踐:定義為靜態/全局(自動零初始化),或在使用前 memset(words, 0, sizeof(words))

測試樣例

輸入:Hello World Here I Come
輸出:Come I Here World Hello
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved