天天看点

openjudge 计算概论 字符串 2:单词倒排

2:单词倒排

查看 提交 统计 提问

总时间限制: 1000ms 内存限制: 65536kB

描述

编写程序,读入一段英文(英文中不包含标点),将所有单词的顺序倒排并输出,其中单词以空格分隔。

输入

输入为一个字符串(字符串长度最大为100)

输出

输出为按要求排续后的字符串

样例输入

I am a student

样例输出

student a am I

主要思想:1.一开始以为单词与单词之间只有一个空格,不对,又认为输入多个空格可以输出时只输出一个空格,然后么,就以空格为界分割字符串。

                             2.第二个正确方法:先翻转整个字符串,遇到第一个单词结尾,倒序输出

有缺版:

#include <stdio.h>

#include <stdlib.h>

#include<string.h>

#define N 101

int main()

{

    char a[N];

    int n,i,j=0,h=0,k,count[N] ;

    gets(a);

    for(i=0; a[i]!='\0'; i++)

        if(a[i]==' '&&a[i+1]==' ')//有多个空格时到最后一个空格计数

           i++;

       else if(a[i]==' ')

            count[j++]=i;

    for(i=j-1; i>=0; i--) //倒序输出,从最后一个单词输出。

    {

        k=count[i]+1;//单词位置为空格加一

        for(; a[k]!=' '; k++)

        {

            if(a[k]=='\0')

                break;

            printf("%c",a[k]);

        }

        printf(" ");

    }

    for(i=0; a[i]!=' '; i++)//最后一个单词单独输出,因为计空格数是是从第二个单词记的。

        printf("%c",a[i]);

    printf("\n");

    return 0;

}

正确版

#include <stdio.h>

#include <stdlib.h>

#include<string.h>

int main()

{

    char a[500],temp,b[500];//a数组存贮整个句子,b存储某一个单词

    int i,len,j,k;

    gets(a);

    len=strlen(a);

    for(i=0;i<len/2;i++)//对整个字符串进行翻转

    {

        temp=a[i];

        a[i]=a[len-1-i];

        a[len-1-i]=temp;

    }

    //printf("\n%s\n",a);

    i=0;

    j=0;

    while(a[i]!='\0')

    {

        if(a[i]!=' ')

        {//扫描句子,遇到非空格字符则存到b数组

            b[j]=a[i];

            j++;

        }

        else

        {//扫描句子时遇到空格,逆向输出b数组存贮的那个被逆序的单词

            for(k=j-1;k>=0;k--)

            {

                printf("%c",b[k]);

            }

            printf(" ");//如果有多的空格也可以输出

            j=0;

        }

        i++;

    }

    for(k=j-1;k>=0;k--)//最后一个单词需要单独处理。因为末尾是终止符不是空格

    {

        printf("%c",b[k]);

    }

    return 0;

}