1.有一个字符数组的内容为 : “student a am i”, 请你将数组的内容改为”i am a student”.
要求:不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。
思路:student a am i ->i ma a tneduts ->i am a student
也就是说先将所有的字符进行逆置,然后对每一个单词进行逆置。
#include<stdio.h>
#include<assert.h>
int my_len(char *str)
{
assert(str);
int count = 0;
while (*str++)
{
count++;
}
return count;
}
void reverse(char *start, char *end)
{
assert(start&&end);
while (start < end)
{
char tmp = *start;
*start = *end;
*end = tmp;
start++;
end--;
}
}
void str_reverse(char *str)
{
assert(str);
int len = my_len(str);
reverse(str, str + len - 1); //全部逆置
while (*str != '\0')
{
char *pos = str;
while((*str != ' ')&&(*str!='\0'))
{
str++;
}
reverse(pos, str - 1); //每个单词的逆置
if (*str != '\0')
str++;
}
}
int main()
{
char str[] = "student a am i";
str_reverse(str);
printf("%s\n", str);
system("pause");
return 0;
}
2.字符串替换空格
请实现一个函数,把字符数组中的每个空格替换成“%20”。
例如输入“we are happy.”,则输出“we%20are%20happy.”。
思路:先统计出字符串中有多少个空格,因为加“%20”后,整体的长度增加了“原长度+空格*2”个,然后把最后一个向后移动,遇到空格的时候,依次替换为”%20”。
#include<stdio.h>
#include<string.h>
void replace_space(char *string,int len)
{
int count = 0;
int i = 0;
int pos = 0;
int end = 0;
int new_len = 0;
for (i = 0; i < len; i++)
{
if (string[i] == ' ')
count++;
}
new_len = len + 2 * count;
pos = new_len - 1;
end = len - 1;
while (pos>end)
{
if (string[end] == ' ')
{
string[pos--] = '0';
string[pos--] = '2';
string[pos--] = '%';
}
else
{
string[pos--] =string[end];
}
end--;
}
}
int main()
{
char string[30] = "we are happy";
int len = strlen(string);
replace_space(string, len);
printf("%s\n", string);
system("pause");
}
其实大家可以看见,这两个题是比较相似的。不论是逆置还是添加,首先我们需要明白的是这个程序执行的过程,只有当整个流程都理顺了,才能很好的完成整个代码的书写。