首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

求教puts()参数的有关问题

2013-03-01 
求教puts()参数的问题本帖最后由 nain001 于 2013-02-07 10:57:36 编辑题目:编写一个程序,按照相反的单词

求教puts()参数的问题
本帖最后由 nain001 于 2013-02-07 10:57:36 编辑

题目:编写一个程序,按照相反的单词顺序显示命令行参数。
如命令行参数是“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)为什么不行呢?
}

[解决办法]

第一次倒置整个字符串完成后,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
[解决办法]
我也是和1楼一下。
总结一下:
1.第一个 p=str;//看答案的,前面已有这句了,为什么这里还要来这个?  ----没有也可以,因为p没有改变
2.第二个人 puts(str);//我把这句换成puts(p)为什么不行呢?  ---因为上一句while(*p++!='\0');已经改变p,p不再指向开始str
[解决办法]

//处理出来的输出单词函数
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锁定到单词的右位置,然后输出。
最后一个单词要单独处理了

热点排行
Bad Request.