一段改变我思想的代码!!!

有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student".
要求:

不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。



#include<stdio.h>
#include<stdlib.h>
int main()
{
int i=0;
char arr[]="student a am i";
int sz=sizeof(arr)/sizeof(arr[0]);
for(; i<sz; i++)
{
char *pa=NULL;
char *pb=NULL;
int left=0;
int right=sz;
pa=&arr[left];
pb=&arr[right];

while(left<=right)
{
 left++;
 right--;
 if(*pa==' ')
 {
     right-=1;
 }
 if(*pb=' ')
 {
 left+=1;
 }
 if(*pa==*pb==' ')
 {
  char tmp;
  tmp=*pa;
  *pa=*pb;
  *pb=tmp;
    }
}
printf("%c",arr[i]);
}
    system("pause");
return 0;
}



结果是这样的:

然而,字符串没发生改变,而是原样输出了。我本来想着左右各一个指针,遇到空格就说明是一个单词,

然后进行逆序,最后再将整个字符串逆序,结果发现单词的长度不同,指针不能同时控制(意思就是两边遇到空格不同时),

貌似我完全驾驭不了,所以便放弃了,也有可能是我现在能力太弱吧!



老师讲了之后,我又试着去敲此代码,结果令我好意外!

#include<stdio.h>
#include<stdlib.h>


void reverse(char *left,char *right)//逆置函数
{
while(left<right)
{
int tmp;
tmp=*left;
*left=*right;
*right=tmp;
left++;
right--;
}
}


void reverse_arr(char arr[],int sz)//检查字符串内部的逆序函数
{
char *left=arr;
char *right=arr+sz-1;
char *start=arr;
char *end=arr;
reverse(left,right);
while(*end!='\0')
{
while((*end!='\0') && (*end!=' '))      //错误1:while((*end!='\0') && (*end==' '))
{
end++;
}
reverse(start,end-1);//错误2:把调用语句放到了if语句之后
if(*end!='\0')

               {      

                  start=end+1;

                  end=start;

}
}
}


int main()
{
char arr[]="stdudent a am i";
int sz=sizeof(arr)/sizeof(arr[0])-1;
reverse_arr(arr,sz);
printf("%s\n",arr);
    system("pause");
return 0;
}



结果只有整个字符串逆序了,根本没达到预期结果。除以上两种错误后,还有一些小问题,

我才深深体会到人万万不可眼高手低,否则欺骗的只能是自己!!!

以后一定要把学过的知识吃透,吃杂实,勤于练习,善于发现和学习新知识。



  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值