OpenJudge计算概论-单词翻转

时间:2021-04-27 22:34:45
/*==============================================================
单词翻转
总时间限制: 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]!='\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]);
}
printf(
"\n");
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("\n");
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对空格的忽略是个硬伤啊