//有一个字符数组的内容为:“student a am i”,
// 请你将数组的内容改为"i am a student".
// 要求:
// 不能使用库函数。
// 只能开辟有限个空间(空间个数和字符串的长度无关)。
//
// student a am i
// i ma a tneduts
// i am a student
//
解法一:先整体句子翻转,再单词翻转
//先整体进行交换 再逐个单词内部进行交换
#include <stdio.h>
#include <string.h>
void reversestring(char* left,char* right) {
char temp ;
while(left<right) {
temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
}
void reverse_string(char* string,int N) {
char temp;
char* left = string;
//定位最后一个字母
char* right = string+N-1;
//整个句子进行交换
reversestring(left,right);
//打印整个句子交换的情况
printf ("%s\n",string);
//再进行各个单词的交换
while(*string) {
//初始化起始端
left = string;
//检测单词,如果有单词,srting++
while((*string)!=' '&&(*string)!='\0') {
string++;
}
//如果单词结束是一个空格的话,或者是结束标志位时候
//把单词最后一个字母传到末端
right = string-1;
//完成交换
reversestring(left,right);
//交换完成++string
if(*string == ' '){
string++;
}
}
}
int main () {
char string[] ={"student a am i"};
int i = strlen(string);
printf("%s\n",string);
reverse_string(string,i);
printf("%s\n",string);
return 0;
}
解法二:先每个单词翻转,再整体句子翻转
//先交换单词的顺序,再进行整条句子的交换
//交换函数
#include<stdio.h>
#include<string.h>
void reversestring(char* string,int start,int end) {
char temp ;
int i,j;
//末尾的下标要进行减1操作,这样才是单词最后一个字母
for(i = start,j = end-1;i<j;i++,j--) {
temp = string[i];
string[i] = string[j];
string[j] = temp;
}
}
void string_(char* string,int len){
int i;
int start = 0; //初始化开始节点
//开始遍历字符数组
for( i = 0;string[i]!='\0';i++) {
//如果有空格说明有一个单词遍历过
if(string[i] ==' ') {
//i 此时为空格那一位的下标,进行交换
reversestring(string,start,i);
//让初始化定位到下一个单词处
start =i+1;
}
}
reversestring (string,0,i);
}
int main () {
char string[] ={"student a am i"};
int i = strlen(string);
printf("%s\n",string);
string_(string,i);
printf("%s\n",string);
return 0;
}
解法三 :库函数实现
char* string_(char* string){
char* ptmp;
char temp[1024] ={0};
//从右边找到空格
while(ptmp = strrchr (string,' ')) {
//地址加1开始拼接
strcat(temp,ptmp+1);
//拼接完成之后给空格
strcat(temp," ");
*ptmp = '\0';
}
strcat(temp,string);
strcpy(string,temp);
return string;
}
int main () {
char string[] ={"student a am i"};
puts(string_(string));
return 0;
}