首页 > 试题广场 >

句子逆序

[编程题]句子逆序
  • 热度指数:534610 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}对于给定的若干个单词组成的句子,每个单词均由大小写字母混合构成,单词间使用单个空格分隔。输出以单词为单位逆序排放的结果,即仅逆序单词间的相对顺序,不改变单词内部的字母顺序。

输入描述:
\hspace{15pt}在一行上输入若干个字符串,每个字符串代表一个单词,组成给定的句子。
\hspace{15pt}除此之外,保证每个单词非空,由大小写字母混合构成,且总字符长度不超过 10^3


输出描述:
\hspace{15pt}在一行上输出一个句子,代表以单词为单位逆序排放的结果。
示例1

输入

Nowcoder Hello

输出

Hello Nowcoder
示例2

输入

A b C d

输出

d C b A
13行解决
#include <stdio.h>
int main() {
    char str[100][100];
    int word_num = 0;
    while (scanf("%s", str[word_num++]) != EOF) {
        if (getchar() == '\n') break;
    }
    for (int i = word_num - 1; i > 0; i--) {
        printf("%s ", str[i]);
    }
    printf("%s", str[0]);
    return 0;
}


发表于 2025-05-08 10:37:10 回复(0)
#include <stdio.h>
#include <string.h>
int main() {
    char str[1001];
    fgets(str, 1001, stdin);
    int len = strlen(str) - 1;
    int end = len;
    for(int i = len;i >= 0;i--){
        if(str[i] == ' '){
            for(int j = i+1;j < end;j++){
                printf("%c",str[j]);
            }
            end = i;
            printf("%c",' ');
        }
    }
    for(int i = 0;i < end; i++){
        printf("%c",str[i]);
    }
    return 0;
}
发表于 2025-04-12 18:51:42 回复(0)
倒着暴力输出
#include <stdint.h>
#include <stdio.h>
#include <string.h>

int main() {
    uint8_t str[1000];
    fgets((char*)str, sizeof(str), stdin);
    str[strlen(str)-1] = '\0';
    for(int i = strlen((char*)str); i > 0; i--)
    {
        if(str[i] == ' ')
        {
            for (int j = i + 1; str[j] != ' ' && str[j] != '\0'; j++) {
                putchar(str[j]);
            }
            putchar(' ');
        }
    }
    for(int k = 0;str[k] != ' ' && str[k] != '\0'; k++)
    {
        putchar(str[k]);
    }

    return 0;
}


发表于 2025-03-08 20:36:42 回复(0)
#include <ctype.h>
#include <stdio.h>
#include <string.h>

int main() {
    char s[1000]={0};
    char sub[1000]={0};
    scanf("%[^\n]\n",s);
    int len=strlen(s);
    int start=0,end=0;

    while (start < len) {
        if (isalpha(s[end])) {
            end++;
        }
        if (!isalpha(s[end])) {
            s[end] = ' ';
            memmove(sub + (end - start+1), sub, sizeof(char) * (strlen(sub)));
            strncpy(sub,s+start,end-start+1);
            end++;
            start = end;
        }
    }
    printf("%s\n",sub);
    return 0;
}
发表于 2025-02-25 19:57:06 回复(0)
#include<stdio.h>
#include<string.h>
int main() {
    char s[1001];
    while (fgets(s, 1001, stdin)) {
        s[strlen(s) - 1] = '\0';//fgets最后多一个\n替换为\0
        for (int i = strlen(s) - 1; i >= 0; i--) {
            if (s[i - 1] == ' ') {
                printf("%s ", s + i);//从后往前,每碰到一个空格打印空格后面的字符串
                s[i - 1] = '\0';//空格变为\0,每个字符串都会遇到\0而停止打印
            }
        }
        printf("%s\n", s);//打印首字符串
    }
    return 0;
}

发表于 2024-09-11 20:06:18 回复(0)
28行搞定
#include <stdio.h>
#include <string.h>
int main() {
    char arr[1000] = {0};
    char temp[1000] = {0};
    gets(arr);
    int len = strlen(arr);
    int count = 0;
    for (int i = len - 1; i >= 0; i--) {
        if (arr[i] == ' ') {
            for (int j = count - 1; j >= 0; j--) {
                printf("%c", temp[j]);
            }
            printf(" ");
            count = 0;
            continue;
        } else {
            temp[count] = arr[i];
            count++;
        }
        if (i == 0) {
            for (int j = count - 1; j >= 0; j--) {
                printf("%c", temp[j]);
            }
        }
    }
    return 0;
}

发表于 2024-08-04 14:00:03 回复(0)
//里面有注释,应该可以辅助记忆。
#include <ctype.h>
#include <stdio.h>
#include <string.h>

/*
 * ch[]:要被逆序的数组,start:逆序操作的起始位置,end:逆序操作的结束位置。
*/
int proc(char ch[], int start, int end) {
    // 检查输入参数
    if (ch == NULL || start >= end) {
        return -1; // 输入参数错误
    }

    // 逆序操作
    for (int i = start, j = end; i < j; i++, j--) {
        char temp = ch[i];
        ch[i] = ch[j];
        ch[j] = temp;
    }

    return 1; // 成功执行逆序
}

void print(char a[]) {
    int len = strlen(a);
    for (int i = 0; i < len; i++) {
        printf("%c", a[i]);
    }
    printf("\n");
}

int main() {
    char arr[1002] = "\0";
    int slow = 0, fast = 0; //快慢Flag,辅助标记用

    fgets(arr, sizeof(arr), stdin);
    arr[strcspn(arr, "\n")] = '\0';

    int len = strlen(arr);
    int i = 0;

    //确保每一个数组元素是字符或空格
    for (i = 0; i < len; i++) {
        if ( !(isalpha(arr[i]) || isblank(arr[i])) ) {
            return -1;
        }
    }

    //第一次处理,先反转全部字符串
    proc(arr, 0, len - 1);

    //第二次处理,反转每个单词。初始slow和fast都是零。
    for (i = 0; i < len; i++) {
        if (arr[i] == ' ') {
            fast = i - 1; //快游标拿到一个单词的末尾游标值
            proc(arr, slow, fast);
            slow = i + 1;
        }
    }

    //这一步是反转最后一个单词,此时特殊在 slow < len-1 ,且因为上一步的for循环循环到最后时,
    //最后一个元素不是空格而是\n了,所以此时直接反转从 slow 到 len-1 的元素即可。
    if(slow < len - 1) {
        proc(arr, slow, len - 1);
    }

    print(arr);

    return 0;
}


编辑于 2024-04-07 22:11:27 回复(0)
#include <stdio.h>
#include <string.h>
struct stringarr{
    int index;
    char word[100];
};
int main() {
    char inputdata[100];
    struct stringarr str1[100];
    int i=0;
   
    while(scanf("%s",str1[i].word)!=EOF)
    {
        str1[i].index=i;
        i++;
    }
    int max =i-1;

    for(i=max;i>=0;i--)
    {   if(i==0)
        {
            printf("%s",str1[i].word);
        }
        else {
            printf("%s ",str1[i].word);
        }

    }
    return 0;
}
编辑于 2024-03-27 16:21:09 回复(0)
#include <stdio.h>
#include <string.h>
int main()
{
    char str[1001];
    fgets(str,1001,stdin);
    int len=strlen(str);
    int count=0;
    for(int i=0;i<len;i++)
        if(str[i]==' ')
            count++;
    int p1 = len - 2, p2 = len - 2;
    /*fgets函数会在输入的字符串后面自动加\0,统计字符串长度时也会把\0算一个字符。如果用的是gets函数则不会把\0算进字符串长度*/
    for(int j=0;j<=count;j++)
    {
        while(str[p1]!=' '&&p1>=0)
            p1--;
        for(int k=p1+1;k<=p2;k++)
            printf("%c",str[k]);
        printf(" ");
        p1--;
        p2=p1;
    }
    return 0;
}
编辑于 2024-03-10 17:18:23 回复(0)
#include <stdio.h>

int main() {
    char a[200][30];
    int i=0,j;
    while (scanf("%s",a[i]) != EOF) 
    {
        i++;
    }
    for(j=i-1;j>=0;j--)
    {
        if(j==0) printf("%s",a[j]);
        else printf("%s ",a[j]);
    }
    return 0;
}

发表于 2024-02-15 10:02:35 回复(0)
//为什么我的代码慢别人三倍……
#include <stdio.h>
int main() {
    char a[1002],c=getchar();int i=0,j;a[i++]=' ';
    while (c!='\n') {
        a[i++]=c;c=getchar();
    }
    a[i]=' ';
    while (i) {
    for(j=--i;a[j]!=' ';j--);
    i=j;
    while(a[++i]!=' ')
    putchar(a[i]);
    i=j;
    putchar(' ');
    }
    return 0;
}
编辑于 2023-12-07 11:00:28 回复(0)
#include <stdio.h>
#include <string.h>
int main() {
    int a, b;
    char str[1002];
    gets(str);
    int i,j;
    int len = strlen(str);
    j = len-1;
    for(int  i =len-1; i>=0; i--)
    {
        if(str[i]==' ')
        {  
            for(a = i+1; a <=j;a++)
            {
                printf("%c",str[a]);
            }
            printf(" ");
            j = i-1 ;
        }
        if(i==0)
        {
            for(a = i; a <=j;a++)
            {
                printf("%c",str[a]);
            }
        }
    }
    return 0;
}
发表于 2023-11-30 15:47:18 回复(2)
关键点:关键是对字符串中空格字符的使用。
思路:从后往前遍历每个字符,遇到空格则将空格换为\0,并打印从空格起的字符串
注意点:单独处理第一个单词。
缺点:这种做法改变了原始字符串的内容。若不想改变,就不替换空个格,打印的时候计算单词长度进行字符打印  。
#include <stdio.h>

int main() {
    int len;
    char str[1001] ={0};
    gets(str);
    len = strlen(str);
    while(len--)
    {
        if(str[len] == ' ')
        {
            printf("%s ", &str[len + 1]);
            str[len] = '\0';
        }
    }
    printf("%s", str);
    return 0;
}


发表于 2023-11-25 17:19:09 回复(0)
#include <stdio.h>
/*思路:把单词依次存入字符串数组,然后逆序输出字符串*/

int main() {
    char word[1000][1000]={0};
    int n = 0;
    while (scanf("%s", word[n++]) != EOF){}
    for (int i = n - 2; i >= 0; i--) { // n-2是因为最后输入'\n'时n也会+1
        printf("%s ", word[i]);
    }
    return 0;
}

发表于 2023-11-09 13:12:39 回复(0)