作业1:
作业要求:
koob si siht 一次逆置
一再逆置结束后,再确定单词,单词内部进行再逆置
book is this
运行代码:
#include<stdio.h>
#include<string.h>
char * Arr_Invertion0(char *pa,int start,int end);//位置:start->end之间的倒置
char * Arr_Invertion1(char *arr);//计算非空格字符串的起始位置的计算
char * Arr_Invertion2(char *arr);//最后一步:整体倒置
int main(int argc, const char *argv[])
{
char arr[30] = "";
printf("输入字符串>>>");
gets(arr);
Arr_Invertion2(arr);
printf("修改后>>>%s\n",arr);
return 0;
}
char * Arr_Invertion2(char *arr)
{
Arr_Invertion1(arr);
Arr_Invertion0(arr,0,strlen(arr)-1);
return arr;
}
char * Arr_Invertion1(char *arr)
{
int result = 1;//1 *pa 在空格中 0 *pa 在字符中
char *pa = arr;
int start = 0; //默认开口不是空格
int end = 0;
if(*arr==' ')//考虑开头是空格的情况
{
result = 1;
}
while(*pa !=0)
{ //this is a book;
if(*pa == ' ' && result == 0)//end = 3
{
result = 1;
end = pa-arr-1;
Arr_Invertion0(arr,start,end);
}
else if(*pa != ' ' && result == 1)//start = 0;
{
start = pa-arr;
result = 0;
}
pa++;
}
if(*(pa-1) != ' ')//如果结尾为空格,不执行这次倒置
{
end = pa-arr-1;
Arr_Invertion0(arr,start,end);
}
return arr;
}
char * Arr_Invertion0(char *pa,int start,int end)
{
int i = 0;
for(i = 0;i<(end-start+1)/2;i++)
{
pa[start+i] = pa[start+i] ^ pa[end-i];
pa[end-i] = pa[start+i] ^ pa[end-i];
pa[start+i] = pa[start+i] ^ pa[end-i];
}
return pa;
}