1.题目
有一个字符数组的内容为:”student a am i”,请你将数组的内容改为”i am a student”.
要求:不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
2.程序代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <Windows.h>
#include <assert.h>
int my_strlen(const char *str)//定义函数,求出数组的长度
{
assert(str != NULL);//assert为断言,如果表达式为假,整个程序退出,并输出错误信息,
//若表达式为真,则继续执行后面的程序
int count = 0;
while (* str++ != '\0')//如果*str不为'\0',则str向后移一位
{
count++;
}
return count;
}
void reverse(char *left, char *right)//定义函数,让数组中的元素逆置
{
assert(left != NULL);
assert(right != NULL);
char mid = '0';
while (left <=right)
{
mid = *left;
*left = *right;
*right = mid;
left++;
right--;
}
}
void change_arr(char *str)//定义函数,用来交换数组中的元素
{
assert(str != NULL);
int ret = my_strlen(str);//交换整个数组
reverse(str, str + ret - 1);
char *left = NULL;//交换每个单词
char *right = NULL;
while (1)
{
left = str;//把这个单词的第一个字母所对应的地址传给left
while (((*str) != ' ')&&((*str)!='\0'))
{
str++;
}//经过循环后,str存放的是空格所在的地址
right = str - 1;//空格所在的地址减一就是这个单词最后一个字母的地址,传给right
reverse(left, right);
str++;//向后加一个到下一个单词的第一个字母的地址
if (*str == '\0')//当传到最后一个字母之后,再加一,得到的就是'\0',这是需要跳出循环
{
break;
}
}
}
int main()
{
char arr[] = "student a am i";//定义一个数组,存放给定的元素
change_arr(arr);
printf("%s\n", arr);
system("pause");
return 0;
}