尝试混合一些字符串时出现意外的分段错误

fel*_*ipX 0 c

我需要以这种方式操作一个字符串:

如果字符是'+'或' - '或'/'或'*',则将它们移动到缓冲区的末尾,否则,移动到缓冲区的开头.

我的解决方案非常简单:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void mix_the_string(char ** buff, char ** string)
{
    printf("The string which will be printed is : %s\n",*string);

    int i = 0;
    int j = strlen(*string) - 1;

    while(i< strlen(*string))
    {
        if(*string[i] != '+' || *string[i] != '-' || *string[i] != '*' || *string[i] != '/')
        {

            printf("in the first if, i = %d, *string[i] = '%d'\n",i,(int)*string[i]);

            *buff[i] = *string[i];
        }
        else
        {
            printf("in the second if, i = %d, *string[i] = '%d'\n",i,(int)*string[i]);
            *buff[j] = *string[i];
        }

        i++;
        j--;
    }
}

int main()
{    
    char * buff  = (char *) malloc(50);
    char * string  = (char *) malloc(50);

    string = "1+2+3";

    mix_the_string(&buff,&string);
    puts(buff);
    free(buff);
    free(string);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

此代码的输出是:

 The string which will be printed is : 1+2+3
 in the first if, i = 0, *string[i] = '49'
 in the first if, i = 1, *string[i] = '49'
 Segmentation fault
Run Code Online (Sandbox Code Playgroud)

我希望通过这个例子输出如下:

The string which will be printed is : 1+2+3
in the first if, i = 0, *string[i] = '49'
in the second if, i = 1, *string[i] = '43'
in the first if, i = 2, *string[i] = '50'
in the second if, i = 3, *string[i] = '43'
in the first if, i = 4, *string[i] = '51'
123++
Run Code Online (Sandbox Code Playgroud)

我哪里错了?

raf*_*x07 5

*string[i](*string)[i]符号之间有区别.[]优先级高于*运算符.您通过指针将字符串传递给指针,因此您应该调用(*string)[i]代码的每一行.

(*string)[i]表示 - 取消引用指向数组的指针并获取i-th字符串数组的元素

现在你在做

*string[i]- 获取i-th字符串数组的元素(!!但这不是数组,这只是一个元素)并取消引用第一个元素

做同样的事buff.

main函数中,你应该将1 + 2 + 3字符串文字复制到string缓冲区中,例如按strcpy函数.