OpenJudge计算概论-单词翻转

/*==============================================================
单词翻转
总时间限制: 1000ms 内存限制: 65536kB
描述
    输入一个句子(一行),将句子中的每一个单词翻转后输出
输入
    只有一行,为一个字符串,不超过500个字符。单词之间以空格隔开。
输出
    翻转每一个单词后的字符串
样例输入
    hello world
样例输出
    olleh dlrow
================================================================*/

解析:

这个题和网上流行的单词翻转的题意思不同。网上流传的那个题意思是把句子里面的单词的顺序翻转,单词内字母顺序不变。这个题是把句子里面每一个单词的字母顺序翻转,对整个句子而言,单词的顺序不变。

处理方法:

用gets函数读入整个句子到数组a,然后扫描句子:遇到非空格字符存储到b数组,遇到空格字符则把b数组逆序输出。(呵呵这个地方偷懒了一下,其实应该是把b数组翻转在顺序输出b数组的。)

输出一次b数组后打印一个空格,然后继续扫描a数组重复刚才的过程。

【关键就在这里了,要打印一个空格。这样以来,假如句子里面单词之间有多个空格时,多个空格还是能保留下来的。假如使用下面第二个程序的处理方法,多个空格只能保留一个空格,于是提交是总是说格式错误。】

#include<stdio.h>
#include<string.h>
//void fun(char a[],int len);//将数组a的前len个字符翻转 
int main()
{
    char a[500],b[200];
    int len,i,j,k;
    freopen("5.in","r",stdin);
    gets(a);
    len=strlen(a);
    i=0;
    j=0;
    while(a[i]!='')
    {
        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]);
    }
    printf("
");
    return 0;
}
/*void fun(char a[],int len)
{
    int i,j,t=len/2;
    char temp;
    for(i=0,j=len-1;i<t;i++,j--)
    {
        temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }
}*/

下面的代码提交后结果是格式错误(单词之间有多个空格的只保留了一个空格)

#include<stdio.h>
#include<string.h>
void fun(char a[],int len);
int main()
{
    char str[500];
    int len;
    freopen("5.in","r",stdin);
    //freopen("5.out","w",stdout);
    scanf("%s",str);
    len=strlen(str);
    fun(str,len);
    printf("%s",str);
    
    while(scanf("%s",str)!=EOF)
    {
        len=strlen(str);
        fun(str,len);
        printf(" %s",str);
    }
    //printf("
");
    return 0;
}
void fun(char a[],int len)
{
    int i,j,t=len/2;
    char temp;
    for(i=0,j=len-1;i<t;i++,j--)
    {
        temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }
}

这段代码似乎也没什么办法改进了,毕竟scanf对空格的忽略是个硬伤啊

原文地址:https://www.cnblogs.com/huashanqingzhu/p/3458803.html