Fork me on GitHub

逆序字符串问题


题目

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

要求:

不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。

算法分析

先将整个字符串整体逆置,再以每个单词为对象局部逆置(这时判断条件复杂一些);这里逆置时,需要一个逆置函数,需要两个参数,首指针和尾指针,由这两个指针锁定一个区域,将里面的字符从头至尾逆置

注意:

  • 最后一次跳出while循环时,相当于*pcur==’\0’,所以最后这个单词没有逆置,需要再次调用逆置函数
  • if(表达式){语句1}语句2;这样的结构,无论if表达式成立与否,语句2都会执行的

效果展示

图片加载

参考代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <stdio.h>  
#include <assert.h>

int my_strlen(const char *str)
{
int count = 0;
assert(str);
while(*str++)
{
count++;
}
return count;
}

void reverse_str(char *left,char *right)
{
assert(left);
assert(right);
while(left < right)
{
char temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
}

void reverse(char *str)
{
assert(str);
char *left = str;
char *right = str + my_strlen(str) - 1;
reverse_str(left,right);
}

int main()
{

char arr[] = "student a am i";
printf("请逆转每个单词:%s\n\n",arr);
char *pcur = arr;
//逆序字符串
reverse(arr);
//逆序单词
while(*pcur)
{
char *start = pcur;
while(*pcur != ' '&&*pcur != '\0')
{
pcur++;
}
reverse_str(start,pcur-1);
if(*pcur == ' ')
pcur++;
}
printf("逆转后的结果:\n");
puts(arr);
return 0;
}
-------------本文结束感谢您的阅读-------------