【PAT乙级】1009 说反话 (20 分) C语言实现

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:

测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。

输出格式:

每个测试用例的输出占一行,输出倒序后的句子。

输入样例:

Hello World Here I Come

输出样例:

Come I Here World Hello

华丽的分割线

代码实现:

  1. 解法一:
#include <stdio.h>
#include <string.h>

int main() {
    char arr[81], temp[81], target[81];

    if (scanf("%[^\n]", arr)) {
        int len = strlen(arr);
        int j = 0, k = 0;

        for (int i = len - 1; i >= 0; i--) {
            // 先将字符倒着放到 临时数组 中
            if (arr[i] != ' ') {
                temp[k] = arr[i];
                k++;
            }

            // 如果遇到空格,就将 临时数组 放置到目标数组中
            if (arr[i] == ' ' || i == 0) {
                for (k = k - 1; k >= 0; k--) {
                    target[j] = temp[k];
                    j++;
                }
                k = 0;
            }

            // 遇到空格就往 目标数组 中添加空格
            if (arr[i] == ' ') {
                target[j] = ' ';
                j++;
            }

            // 在数组最后添加 \0 用来表示字符串的结束
            if (i == 0) {
                target[j] = '\0';
            }
        }

        // 打印输出
        printf("%s\n", target);
    }

    return 0;
}
  1. 解法二:
#include <stdio.h>
#include <string.h>

int main() {
    char arr[81];
    if (scanf("%[^\n]", arr)) {
        for (int i = strlen(arr) - 1; i >= 0; i--) {
            // 当遇到空格,就输出后面的字符串
            if (arr[i] == ' ') {
                printf("%s", &arr[i + 1]);
                printf("%c", arr[i]);
                arr[i] = '\0';
            }

            // 如果 i==0 的时候是非空格的,就输出,因为不会有更靠前的数组下标了
            if (i == 0) {
                printf("%s", arr);
            }
        }

        printf("\n");
    }

    return 0;
}
posted @ 2022-05-26 08:41  夏夜星空晚风  阅读(22)  评论(0编辑  收藏  举报