求助C/C++指针高手解惑!!!
/*编写一个程序,按照相反的单词顺序显示命令行参数。即,如果命令行参数是seeyoulater,程序的显示应该为lateryousee。#include<stdio.h>...
/*编写一个程序,按照相反的单词顺序显示命令行参数。
即,如果命令行参数是see you later,程序的显示应该为later you see。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
char str[81];
char *p, temp;
int i,n,length;
gets(str);
for (p = str,i=0,n = strlen(str); i<n/2; i++)//将整个字符串倒序
{
temp = *(p+n-1-i);
*(p+n-1-i) = *(p+i);
*(p+i) = temp;
}
puts(str);
p = str;
length=0;
do //将字符串中的每个单词倒序(用到上一次输出,例如原来输入为abc def)
{ //上次输出为fed cba ,则该段输出则为 def abc
if( isalpha(*p) ) //当不是空格,即还是那个单词时
{
length++;
}
else
{
if(length>1)
for(i=0; i<length/2; i++)
{
temp = *(p-1-i); //???意思
*(p-1-i) = *(p-length+i);
*(p-length+i) = temp;
}
length = 0;
}
}while(*p++ != '\0'); //每执行完一次P+1
puts(str);
return 0;
}
下面是什么意思???
for(i=0; i<length/2; i++)
{
temp = *(p-1-i); //???意思
*(p-1-i) = *(p-length+i);
*(p-length+i) = temp;
}
//???这些是什么意思?一开始时P不是就是只指向了str
的首地址的吗?他*(p-1-i);还减一??可以减??那她会减后到底还会只想哪里??
还有的是这几句是什么意思?希望高手可以详细解答,谢谢~~~~ 展开
即,如果命令行参数是see you later,程序的显示应该为later you see。
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
char str[81];
char *p, temp;
int i,n,length;
gets(str);
for (p = str,i=0,n = strlen(str); i<n/2; i++)//将整个字符串倒序
{
temp = *(p+n-1-i);
*(p+n-1-i) = *(p+i);
*(p+i) = temp;
}
puts(str);
p = str;
length=0;
do //将字符串中的每个单词倒序(用到上一次输出,例如原来输入为abc def)
{ //上次输出为fed cba ,则该段输出则为 def abc
if( isalpha(*p) ) //当不是空格,即还是那个单词时
{
length++;
}
else
{
if(length>1)
for(i=0; i<length/2; i++)
{
temp = *(p-1-i); //???意思
*(p-1-i) = *(p-length+i);
*(p-length+i) = temp;
}
length = 0;
}
}while(*p++ != '\0'); //每执行完一次P+1
puts(str);
return 0;
}
下面是什么意思???
for(i=0; i<length/2; i++)
{
temp = *(p-1-i); //???意思
*(p-1-i) = *(p-length+i);
*(p-length+i) = temp;
}
//???这些是什么意思?一开始时P不是就是只指向了str
的首地址的吗?他*(p-1-i);还减一??可以减??那她会减后到底还会只想哪里??
还有的是这几句是什么意思?希望高手可以详细解答,谢谢~~~~ 展开
5个回答
展开全部
我奇怪的是 see you later,程序的显示应该为later you see。并没有将每个单词倒序啊。
而且代码里面处理的也不是命令行参数,而是读取了一个 字符串进去啊。 p是指向了一个单词的最后一个字符的下一个
这几句的意思就是把一个单词的顺序颠倒
*(p-1-i)是单词的最后一个char
*(p-length+i);是单词的第一个char
首尾颠倒,直到最中间就是把整个单词颠倒了 ....
do //执行到这里时,p仍指向str首地址
{
if( isalpha(*p) ) //先做这个判断 *p不是空格,length自增1后,注意while里p++
{
length++;
}
else //以fed cba为例,此时p指向的是d c间的空格
{
if(length>1)
for(i=0; i<length/2; i++)
{
temp = *(p-1-i); //首次循环时i=0; *(p-1)=d ;以fed cba为例
*(p-1-i) = *(p-length+i);
*(p-length+i) = temp;
} //for循环是交换fed为def
length = 0;
}
}while(*p++ != '\0'); //每执行完一次P+1,注意while里的判断!!! see you later为length=3
for(i=0; i<length/2; i++)// i<length/2也就是i<3/2最后 i<1
{
temp = *(p-1-i); //???意思先取出单词see 存在temp中 temp =see
*(p-1-i) = *(p-length+i); //将later存在第一个位置
*(p-length+i) = temp; //将原第一个位的单词see存到第三个位置,第二个单
而且代码里面处理的也不是命令行参数,而是读取了一个 字符串进去啊。 p是指向了一个单词的最后一个字符的下一个
这几句的意思就是把一个单词的顺序颠倒
*(p-1-i)是单词的最后一个char
*(p-length+i);是单词的第一个char
首尾颠倒,直到最中间就是把整个单词颠倒了 ....
do //执行到这里时,p仍指向str首地址
{
if( isalpha(*p) ) //先做这个判断 *p不是空格,length自增1后,注意while里p++
{
length++;
}
else //以fed cba为例,此时p指向的是d c间的空格
{
if(length>1)
for(i=0; i<length/2; i++)
{
temp = *(p-1-i); //首次循环时i=0; *(p-1)=d ;以fed cba为例
*(p-1-i) = *(p-length+i);
*(p-length+i) = temp;
} //for循环是交换fed为def
length = 0;
}
}while(*p++ != '\0'); //每执行完一次P+1,注意while里的判断!!! see you later为length=3
for(i=0; i<length/2; i++)// i<length/2也就是i<3/2最后 i<1
{
temp = *(p-1-i); //???意思先取出单词see 存在temp中 temp =see
*(p-1-i) = *(p-length+i); //将later存在第一个位置
*(p-length+i) = temp; //将原第一个位的单词see存到第三个位置,第二个单
展开全部
see you later为length=3
for(i=0; i<length/2; i++)// i<length/2也就是i<3/2最后 i<1
{
temp = *(p-1-i); //???意思先取出单词see 存在temp中 temp =see
*(p-1-i) = *(p-length+i); //将later存在第一个位置
*(p-length+i) = temp; //将原第一个位的单词see存到第三个位置,第二个单词不变
}
for(i=0; i<length/2; i++)// i<length/2也就是i<3/2最后 i<1
{
temp = *(p-1-i); //???意思先取出单词see 存在temp中 temp =see
*(p-1-i) = *(p-length+i); //将later存在第一个位置
*(p-length+i) = temp; //将原第一个位的单词see存到第三个位置,第二个单词不变
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
p是指向了一个单词的最后一个字符的下一个
这几句的意思就是把一个单词的顺序颠倒
*(p-1-i)是单词的最后一个char
*(p-length+i);是单词的第一个char
首尾颠倒,直到最中间就是把整个单词颠倒了
这几句的意思就是把一个单词的顺序颠倒
*(p-1-i)是单词的最后一个char
*(p-length+i);是单词的第一个char
首尾颠倒,直到最中间就是把整个单词颠倒了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
....
do //执行到这里时,p仍指向str首地址
{
if( isalpha(*p) ) //先做这个判断 *p不是空格,length自增1后,注意while里p++
{
length++;
}
else //以fed cba为例,此时p指向的是d c间的空格
{
if(length>1)
for(i=0; i<length/2; i++)
{
temp = *(p-1-i); //首次循环时i=0; *(p-1)=d ;以fed cba为例
*(p-1-i) = *(p-length+i);
*(p-length+i) = temp;
} //for循环是交换fed为def
length = 0;
}
}while(*p++ != '\0'); //每执行完一次P+1,注意while里的判断!!!
do //执行到这里时,p仍指向str首地址
{
if( isalpha(*p) ) //先做这个判断 *p不是空格,length自增1后,注意while里p++
{
length++;
}
else //以fed cba为例,此时p指向的是d c间的空格
{
if(length>1)
for(i=0; i<length/2; i++)
{
temp = *(p-1-i); //首次循环时i=0; *(p-1)=d ;以fed cba为例
*(p-1-i) = *(p-length+i);
*(p-length+i) = temp;
} //for循环是交换fed为def
length = 0;
}
}while(*p++ != '\0'); //每执行完一次P+1,注意while里的判断!!!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
我奇怪的是 see you later,程序的显示应该为later you see。并没有将每个单词倒序啊。
而且代码里面处理的也不是命令行参数,而是读取了一个 字符串进去啊。
而且代码里面处理的也不是命令行参数,而是读取了一个 字符串进去啊。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询