由前一篇文章交换内存得到:
输入:student. a am i
输出:i am a student.
#include <iostream>
#include <cstring>
using namespace std;
void *reversem (void * pointer,const size_t mem_n);
void *reverse_adjacent_m(void * pointer,const size_t head_size,const size_t total_size);
void *reverse_non_adjacent_m(void * pointer,const size_t head_size,const size_t end_size,const size_t total_size);
int main(void)
{
char str[50001];
cin.getline(str,50001);
int head=0,end=0;
int N=strlen(str);
for(int j=0;j<N;j++)
{
if(str[j]==' '&&str[j-1]!=' ')
{
head=j-1;
}
if(str[j]==' '&&str[j+1]!=' ')
{
end=j+1;
}
if(str[head+1]==' '&&str[end-1]==' ')
{
reverse_non_adjacent_m(str,head+1,N-end,N);
//cout<<N<<' '<<head<<' '<<end<<endl;
N=N-end;
head=end=0;
j=-1;
}
}
for (size_t i=0;i<strlen(str);i++)
cout<<str[i];
cout<<endl;
return 0;
}
void *reversem (void * pointer,const size_t mem_n)
{
if(pointer==NULL) return pointer;
if(mem_n<2) return pointer;
char *beg=static_cast<char*>(pointer);
char *end=beg+mem_n-1;
char tmp;
for(;beg<end;beg++,end--)
{
tmp=*beg;
*beg=*end;
*end=tmp;
}
return pointer;
}
void *reverse_adjacent_m(void * pointer,const size_t head_size,const size_t total_size)
{
if(pointer==NULL) return pointer;
if(total_size<2) return pointer;
char *beg=static_cast<char*>(pointer);
char *mid=beg+head_size;
reversem(beg,head_size);
//char *end=beg+total_size-1;
reversem(mid,total_size-head_size);
reversem(beg,total_size);
return pointer;
}
void *reverse_non_adjacent_m(void * pointer,const size_t head_size,const size_t end_size,const size_t total_size)
{
if(pointer==NULL) return pointer;
if(total_size<3) return pointer;
if(head_size>=total_size||end_size>=total_size) return pointer;
if(total_size<(head_size+end_size)) return pointer;
char *beg=static_cast <char*> (pointer);
reversem(beg,head_size);
reversem(beg+total_size-end_size,end_size);
reversem(beg,total_size);
return pointer;
}