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

//有一个字符数组的内容为:“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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44077227/article/details/89099701