C字符串操作(剪切一些特殊的char *尾部)

时间:2015-03-31 03:15:05

标签: c

为什么在这里我无法得到" cd fjadf"? 该程序始终显示Bus error: 10...

我想使用此super_cut_tail()函数来切断用户指定的///fjdakf。 但为什么这个功能无法实现呢?

char* super_cut_tail(char *char_arg, char *special) {
    char *special_ptr;
    special_ptr = strstr(char_arg, special);
    int len = (int)strlen(char_arg) - (int)strlen(special_ptr);
    char_arg[len] = '\0';
    char_arg = strdup(char_arg);
    return char_arg;
}

int main(int argc, char * argv[])
{
    char *test = "cd fjadf///fjdakf";
    char *outcome;
    outcome = super_cut_tail(test, "///");
    printf("test: %s\n", test);

    return 0;
}

1 个答案:

答案 0 :(得分:2)

由于您正在修改用于初始化test的字符串,因此您的程序会显示未定义的行为。当你使用:

char *test = "cd fjadf///fjdakf";

"cd fjadf///fjdakf"保存在程序的只读存储器中。修改您在行

中执行的字符串
char_arg[len] = '\0';

导致未定义的行为。

使用:

char test[] = "cd fjadf///fjdakf";

你可以做的另一件事就是:

char const* test = "cd fjadf///fjdakf";

并在尝试修改之前先在super_cut_tail中复制该字符串。

char* super_cut_tail(char const* char_arg, char *special) {
    char* ret_string = strdup(char_arg);
    char *special_ptr;
    special_ptr = strstr(ret_string, special);
    int len = (int)strlen(ret_string) - (int)strlen(special_ptr);
    ret_string[len] = '\0';
    return ret_string;
}