C语言字符反转

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/q1075355798/article/details/79837791

题目

给定一个字符串,然后将该字符串逆序反转。

思路

  1. 设置两个游标 i 和 j,一个(假设为 i)在字符串的最开始,一个(假设为 j)在字符串的倒数第二位置(倒数第一位置为 ‘\0’ ,不能动它),i 和 j 位置的值互相交换后,i 加一个位置,j 减一个位置,两个位置上的值再次进行交换。重复上面的操作,直到 j 不大于 i。
  2. 使用栈的方法,根据栈的特点,先进后出,push 一次栈然后 pop 一次栈,就可以完成反转。

代码实现

  1. 思路1代码实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


static void flipping(char* s)
{
    int len = 0;
    if (!s) {
        printf("string is null !\n");
        return;
    }

    len = strlen(s);
    for (int i = 0, j = len - 1; j > i; j--, i++) {
        char temp = s[i];
        s[i] = s[j];
        s[j] = temp;
    }

    return;
}

int _tmain(int argc, _TCHAR* argv[])
{
    char s[] = "Hello world!";
    printf("%s\n",s);
    flipping(s);
    printf("%s\n", s);
    getchar();
    return 0;
}
测试结果

Hello world!
!dlrow olleH

注意

flipping()传入的一定要是char s[]字符串,而不能直接是 char *s 字符串。最基本的原因是, char s[] 存放的区域是在栈区,可以对其中的某个项进行改变;而 char *s 其实只是一个指针,如果直接写成 char *s = “Hello world!”, 那么此处表示,s 是一个指向 “Hello world!” 字符串的指针,而 “Hello world!” 这个字符串,存储在全局只读区,是不能被修改的。在 flipping()函数里是要对 s 指针所指向的内容进行修改的,数组可以修改,而只读区的内容是无法被修改的,故直接传入 char *s 型的字符串进入,会导致内存非法操作的错误出现。
那么,如何在 flipping()函数里面,判定传下来的是一个 char s[] 还是一个 char *s 呢?我这里有一个思路是,利用 sizeof() 和 strlen() 的特性,可以判定大多数的参数是 char s[] 还是 char *s。当然,必定有一个例外。

sizeof(s) - 1 != strlen(s) 在多数情况下可以检测是 char s[] 还是 char *s。当然,当一个字符串的长度为4的时候,此式就不再有效。

猜你喜欢

转载自blog.csdn.net/q1075355798/article/details/79837791