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;
}