| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1983 人关注过本帖
标题:请教大侠们一道很简单的题!!
只看楼主 加入收藏
smallammi
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-1-16
收藏
 问题点数:0 回复次数:20 
请教大侠们一道很简单的题!!
输入一句话,然后让它倒着输出. 比如输入:Beijing is in China. 输出: China in is Beijing.
怎么用C做丫?大家帮帮忙!
搜索更多相关主题的帖子: 大侠 Beijing China 输出 
2007-01-16 22:50
zbqf109
Rank: 1
等 级:新手上路
帖 子:289
专家分:0
注 册:2006-12-31
收藏
得分:0 
这是以前写的一个小东西,针对一个公司的某个面实题。跟这个差不多,但没有处理最后的标点符号。要处理也容易,加上一个判断就行了。

先来看一个用C语言写的程序,程序的功能是将输入的字符串以单词为单位倒序输出,比如输入“hello, world!”,那么程序输出“world!, hello”:
#include <stdio.h>
#include <string.h>
int main()
{int i=0;
char flag='y';
char str[80][100]={"\0"};
while(flag=='y'||flag=='Y')
{
i=0;
printf("Input the string:\n");
while(1)
{
scanf("%s",str[i]);
i++;
if(getchar()==10)
break;
}
i--;
for( ;i>=0;i--)
printf("%s ",str[i]);
printf("\n");
printf("Will you continue ? ( y / n ) :");
flag=getchar();
}
return 0;
}
评价:根据scanf函数的特性,以空格可以作为字符串输入的结束,所以采用了一个二维数组,以回车作为输入串的结束。这样容易实现,但比较浪费空间。假设最长的单词长度为20,而最短的单词长度只有1,那么显然,存储短单词的时候必然带来空间的浪费。
改进1:
#include <stdio.h>
#include <string.h>
int main()
{int i=0,j=0;
char flag='y';
char str[100]="\0";
char *p=str;
int len[80]={0};
while(flag=='y'||flag=='Y')
{
str[0]='\0';
i=0;
j=0;
printf("Input the string:\n");
while(1)
{
p=str+strlen(str);
scanf("%s",p);
len[j]=strlen(p);
j++;
if(getchar()==10)
break;
}
j--;
for( ;j>=0;j--)
{
for(i=0;i<len[j];i++)
printf("%c",p[i]);
p=p-len[j-1];
printf(" ");
}
printf("\n");
printf("Will you continue ? ( y / n ) :");
flag=getchar();
}
return 0;
}
评价:这里用一个一维数组来代替上面的二维数组,并引入另一个数组来记录每个单词的长度,引入一个指针指向存储数组的末尾,当有新单词输入时,从当前字符串的末尾开始存储。当输出时,首先得到单词的长度,然后输出。这解决了空间的浪费。因为两个一维数组要比一个二维数组省得多。而且存储字符串的数组中的字符一个紧接一个,中间没有空格。但这里有个小问题,就是如果输入两个空格,然后回车,那么程序不能认为整个字符串的输入结束,必须等待至少一个字符,第二次回车程序才能判断输入结束。这是scanf函数的弱点带来的。
改进2:
#include <stdio.h>
#include <string.h>
int main()
{
int i=0,j=0,len[10]={0};
char tmp,flag='y';
char str[100]="\0",*p;
p=str;
while(flag=='y'||flag=='Y')
{
for(i=0;i<100;i++)
str[i]='\0';
i=j=0;
p=str;
printf("Input the string:\n");
while(1)
{
tmp=getchar();
if(tmp==10)
break;
if(tmp==32)
{
len[j]=strlen(p);
i=0;
j++;
p=str+strlen(str);
continue;
}
p[i]=tmp;
i++;
}
len[j]=strlen(p);
for(;j>=0;j--)
{
i=0;
while(i<len[j])
{
printf("%c",p[i]);
i++;
}
printf(" ");
p=p-len[j-1];
}
printf("\n");
printf("Will you continue ? ( y / n ) : ");
flag=getchar();
}
return 0;
}
评价:这里不用scanf函数接受字符串,而是用getchar函数逐一结束字符,当有回车,立即结束输入。
教训:
1、最外层while循环如果不加赋值语句"p=str;"则出现段错误;
2、如果用scanf("%c",flag);语句来接受flag的值,那么必须在后面加上 一个getchar();语句来屏蔽回车,否则回车作为内层循环的结束符。

坚决不跟用TC的人打交道!
2007-01-16 23:08
lzz4438253
Rank: 1
等 级:新手上路
帖 子:109
专家分:0
注 册:2007-1-4
收藏
得分:0 

#include<stdio.h>
void reverse() {
char ch;
ch = getchar();
if(ch != '\n') {
reverse();
putchar(ch);
}
}
void main() {
reverse();
}



我乱写的

[此贴子已经被作者于2007-1-16 23:47:42编辑过]


2007-01-16 23:45
lzz4438253
Rank: 1
等 级:新手上路
帖 子:109
专家分:0
注 册:2007-1-4
收藏
得分:0 
楼上的是什么呢

2007-01-16 23:48
神秘失恋
Rank: 1
等 级:新手上路
帖 子:663
专家分:0
注 册:2007-1-6
收藏
得分:0 
顶3楼的...

我正想那样说...
利用递归...

上帝之手.........
2007-01-17 00:32
smallammi
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-1-16
收藏
得分:0 

谢谢各位大侠


2007-01-17 09:26
smallammi
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-1-16
收藏
得分:0 
3楼的,试过你的方法,但是不是我要的那种哦....你是把所有字符都反排序,我要的是每个单次的拼法不变,是以单词为单位来反排序的~不过还是谢谢拉~

2007-01-17 09:35
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
Beijing is in China. 输出: China in is Beijing.
从后往前扫描,并记住每次扫描的起址,每碰到空格符或已经到了尽头则输出,再更新起址.
大致如下:
int k,i=strlen(str)-1,j=i;

while(i>=0)
{
while(i&&str[i]!=' ')
{
i--;
}
for(k=i+1;k<=j;k++)
printf("%c",str[k]);
printf(" ");
i--;//消除空格
j=i;
}

倚天照海花无数,流水高山心自知。
2007-01-17 09:53
海蓝啸
Rank: 5Rank: 5
来 自:安徽
等 级:贵宾
威 望:17
帖 子:1611
专家分:0
注 册:2006-4-3
收藏
得分:0 
逆序字符串不就行了吗

这个社会太复杂。。。
2007-01-17 10:29
mayudong1
Rank: 2
等 级:论坛游民
威 望:1
帖 子:348
专家分:21
注 册:2006-4-18
收藏
得分:0 

哈哈 跟3楼学了点东西


2007-01-17 13:06
快速回复:请教大侠们一道很简单的题!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017912 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved