C语言通过指针和数组实现字符串倒序

 1.数组方式实现  (不用字符串函数)程序如下

 1 void ReverseByArray(char * s)
 2 {
 3     int len = 0;
 4     while (s[len] != '\0')
 5         len++;
 6     int t;
 7     for (int i = 0; i < len / 2; i++)
 8     {
 9         t = s[i];
10         s[i] = s[len - i - 1];
11         s[len - i - 1] = t;
12     }
13 }

与数组有关的操作,必须要用到字符串长度len (因为取长度比较简单,就不用字符串函数了)

在3-5行 首先用检测 '\0' 字符判断取字符串长度 用len变量记录

我尝试过下面这一种代码 测到的字符串长度比原来大1

int len = 0;
while (s[len++] != '\0')
  ; //空语句

就不使用上面这种方法

然后是倒序的具体实现,

常见的好几种方法,网上好多是malloc出来len+1大小的空间 然后逆序放进去

但是我觉得,既然是数组实现,就用一个临时变量t用前后交换的方法 直接完成交换(循环只是循环len/2)

另外一个容易出现问题的是 交换的时候s[len - i - 1] ,为什么要多减1呢?

 

2.用指针的方法 字符串倒序

 1 void ReverseByPointer(char * s)
 2 {
 3     char buf[100];
 4     char *b = buf;
 5     char *p = s;
 6     while (*p != '\0')
 7         *(b++) = *(p++);
 8     while(*s != '\0')
 9         *(s++) = *(--b);
10 }

用指针 就要突出指针的特点 就不像数组

第一眼看上去,程序似乎特别简单.

但是 这个程序用到了缓冲区,

如果这个缓冲区大小不够  ↓如下

在缓冲区足够的情况下 ,程序就会正常运行辣

这里新建的两个指针变量b和p都不是多余 起个别名用 都有实在的作用

buf是数组名 值虽然是数组的首地址,但是这个首地址不能进行加减操作,所以新建了个b指针 指向buf

s 是 char * 类型的 可以加减 但是 加到最后(找到\0后) 怎么倒回来呢? 

那么  我就选择 定义一个p指针变量 并赋值为 指针s  就是 s和p是一样的

而且 p向后移动 找到'\0'后 它的任务就完成了  并不需要回到开始的位置

最后 把buf的内容 -- (倒着)填回 s 指向的字符串就行了

最后就是\0的问题  因为字符串只是倒序 长度没有变化,所以\0用的还是s原来的\0 不用在末尾添加\0

 

3.完整的程序和运行结果

 1 #include <stdio.h>
 2 
 3 void ReverseByArray(char * s)
 4 {
 5     int len = 0;
 6     while (s[len] != '\0')
 7         len++;
 8     int t;
 9     for (int i = 0; i < len / 2; i++)
10     {
11         t = s[i];
12         s[i] = s[len - i - 1];
13         s[len - i - 1] = t;
14     }
15 }
16 
17 void ReverseByPointer(char * s)
18 {
19     char buf[100];
20     char *b = buf;
21     char *p = s;
22     while (*p != '\0')
23         *(b++) = *(p++);
24     while(*s != '\0')
25         *(s++) = *(--b);
26 }
27 
28 int main()
29 {
30     char s[20] = "I Love you 233";
31     printf("源字符串:%s \n", s);
32 
33     ReverseByArray(s);
34     printf("数组方式倒序:%s \n", s);
35 
36     ReverseByPointer(s);
37     printf("指针方式倒序:%s \n", s);
38 }
39 
40 /*  在VC编译器的运行结果
41 源字符串:I Love you 233
42 数组方式倒序:332 uoy evoL I
43 指针方式倒序:I Love you 233
44 请按任意键继续. . .
45 */

 本人原创(博客园)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值