有一个字符数组的内容为:“student a am i”,
请你将数组的内容改为"i am a student".
要求:
不能使用库函数。
只能开辟有限个空间(空间个数和字符串的长度无关)。
提示:
student a am i
i ma a tneduts
i am a student
/*
有一个字符数组的内容为:"student a am i",
请你将数组的内容改为"i am a student".
要求:
不能使用库函数。
只能开辟有限个空间(空间个数和字符串的长度无关)。
student a am i
i ma a tneduts
i am a student
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//第一种方法:
//void reverse_sentence(char* arr)//翻转整个句子,自行查找句子末位处的地址,不利用strlen函数
//{
// char* start = arr;
// char* end = arr;
// while (*arr)
// {
// arr++;
// }
// arr--;
// end = arr;
// while (start<end)
// {
// char temp = *start;
// *start = *end;
// *end = temp;
// start++;
// end--;
// }
//}
//void reverse_word(char* arr)//翻转单词
//{
// while (*arr)
// {
// char* word_start = arr;
// char* word_end = arr;
// while ((*arr != ' ') && (*arr != '\0'))
// {
// arr++;
// }//1.通过空格或者字符串的结束符先找到单词的结束地址
//
// //arr--;
// word_end = arr;
// word_end--;//2.对于翻转的单词地址需要减1
//
// while (word_start < word_end)//3.对单词进行翻转
// {
// char word_temp = *word_start;
// *word_start = *word_end;
// *word_end = word_temp;
// word_start++;
// word_end--;
// }
// if (*arr == '\0')//4.如果当前句子里面所有单词都翻转完毕,则此时*arr=='\0',必须结束程序,否则arr++访问出问题
// {
// break;
// }
// arr++;//5.找到下一个要翻转的单词首地址
// }
//}
//int main()
//{
// char arr[] = "student a am i";
// printf("%s\n", arr);
// reverse_sentence(arr);
// printf("%s\n",arr);
// reverse_word(arr);
// printf("%s\n", arr);
// system("pause");
// return 0;
//}
//第二种方法:
void reverse(char* start, char* end)
{
while (start < end)
{
char temp = *start;
*start = *end;
*end = temp;
start++;
end--;
}
}
int main() {
char input[]="student a am i";
// 翻转整个句子
reverse(input, input + strlen(input) - 1);
// 翻转单词
char* start = input;
while(*start)
{
char *end = start;//1.先找到单词的结尾处的地址
while(*end != ' ' && *end)
end++;
reverse(start, end-1);//2.找到之后对单词进行翻转
if(*end) //3.判断整个句子是否翻转完毕
start = end + 1;
else
start = end;
}
printf("%s", input);
system("pause");
return 0;
}