求教puts()参数的问题

大极张三疯 2013-02-07 10:55:10
题目:编写一个程序,按照相反的单词顺序显示命令行参数。
如命令行参数是“see you later”,程序的显示为“later you see”.

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<conio.h>
#define MAX 100
void reverse(char*);
int main(void){
char str[MAX];
puts("please enter a string,i will reverse it.");
while(gets(str)!=NULL){
reverse(str);
puts("try again!");
}
puts("bey");
getch();
return 0;
}
void reverse(char*str){
char *p;
char temp;
int i,n,wl;
p=str;
for(i=0,n=strlen(str);i<n/2;i++){/*倒置字符串*/
temp=*(p+i);
*(p+i)=*(p+n-1-i);
*(p+n-1-i)=temp;
}
puts(str);

p=str;//看答案的,前面已有这句了,为什么这里还要来这个?
wl=0;
do{ /*倒置字符串中单词的字符*/
if(isalpha(*p))
wl++;
else{
if(wl>1){
for(i=0;i<wl/2;i++){
temp=*(p-wl+i);
*(p-wl+i)=*(p-i-1);
*(p-i-1)=temp;
}
wl=0;
}
}
}while(*p++!='\0');
puts(str);//我把这句换成puts(p)为什么不行呢?
}
...全文
225 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaobao929 2013-02-21
  • 打赏
  • 举报
回复
LZ复杂了... 可以直接使用最简单的倒序输出,不管时间和空间上都不会差多少的...且代码会简洁很多
疯狂的红豆 2013-02-14
  • 打赏
  • 举报
回复

//处理出来的输出单词函数
void put(char *arr,int l,int r)
{
	for (int idx = l; idx <= r; idx++)
	{
		printf_s("%c",arr[idx]);
	}
}
void main()
{
	printf("input a str:");
	char buff[MAX];
	int idx = 0;
	int charNum = 0;
	int lef,rig;
    //输入一行字符串
	char temp;
	for (idx = 0; ;idx++)
	{
		temp = getchar();
		if (temp == '\n')
			break;

		buff[idx] = temp;
	}
	buff[idx] = '\0';
	charNum = idx;
	idx--;

	//输出
	lef = rig = idx;
	for (; idx >= 0; idx--)
	{
		if (buff[idx] == ' ')
		{
			put(buff,idx+1,lef);
			printf_s(" ");

			lef = rig = idx - 1;
		}
	}
	//最后一个单词的特殊处理
	put(buff,0,rig);
}
VS2010上试验过了。 思路是从后向前扫描字符串发现一个空格就把lef锁定到单词的左位置,rig锁定到单词的右位置,然后输出。 最后一个单词要单独处理了
25K纯帅 2013-02-12
  • 打赏
  • 举报
回复
我也是和1楼一下。 总结一下: 1.第一个 p=str;//看答案的,前面已有这句了,为什么这里还要来这个? ----没有也可以,因为p没有改变 2.第二个人 puts(str);//我把这句换成puts(p)为什么不行呢? ---因为上一句while(*p++!='\0');已经改变p,p不再指向开始str
大极张三疯 2013-02-07
  • 打赏
  • 举报
回复
谢谢楼上大哥。 是不是可以这么理解:第一次的倒置P没有改变所指向的地址,而第二次的倒置用到了P++,P所指向的地址变了。 我这样理解可以吗?
慧钦 2013-02-07
  • 打赏
  • 举报
回复
第一次倒置整个字符串完成后,str和p都还是指向开始位置 see you later | str p 所以 p=str;//看答案的,前面已有这句了,为什么这里还要来这个? 你去掉试一下行不行就知道了-- 这个没有也可以的, 写在这里是明确的对下一个功能用到的 p 进行初始化, 这样如果上面的倒置程序改用另一种方式实现,而这种方式是会改变p,那到这里也不会出问题 当然,针对这里的实现,这一句是可以不加的 下面的对单个单词的倒置就是不停的改变p,让p指向下一字符,当while(*p++!='\0');结束时 p已经指向最后的结束符了,所以不能用puts(p),而只能用puts(str) 你一定要用puts(p)的话,可以添加一句 p = str; 然后puts(p) retal uoy ees | | str p

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧