阅读背景:

C语言字符反转

来源:互联网 

题目

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

思路

  1. 设置两个游标 i 和 j,一个(假设为 i)在字符串的最开始,一个(假设为 j)在字符串的倒数第二位置(倒数第一位置为 ‘

    题目

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

    思路

    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的时候,此式就不再有效。


    ’ ,不能动它),i 和 j 位置的值互相交换后,i 加一个位置,j 减一个位置,两个位置上的值再次进行交换。重复上面的操作,直到 j 不大于 i。设置



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: