将NULL分配给c字符串的中间

时间:2015-09-26 19:39:46

标签: c string null-terminated

我正在编写一个函数eliminate(char *str, int character),它将c字符串和一个字符作为输入消除,扫描str以查找character的实例并替换该值当前指数......什么?我认为NULL,但这似乎有风险,可能会混淆依赖于c-string中的null-terminator的其他函数。例如:

char *eliminate(char *str, int character) {
    if (!str) return str;

    int index = 0;
    while (str[index])
       if (str[index] == character)
          str[index++] = '\0'; //THIS LINE IS IN QUESTION
    return str;
}

我的问题是,如何正确实现此功能,以便有效地消除字符串中指定字符的所有实例?如果正确的消除将'\0'分配给要替换的字符,那么这不会影响整个字符串(即,它有效地在遇到的第一个'\0'处结束)。例如,如果我在同一个字符串上运行上述函数两次,则第二个调用将只检查字符串,直到替换最后一个字符的位置。

2 个答案:

答案 0 :(得分:0)

如果您知道自己在做什么,可以使用这种替代品。

仅当char缓冲区char *str可写(动态分配,例如malloc,或者只是堆栈char str[SIZE]上的char数组)时,它才能工作。它不适用于字符串文字。

标准函数strtok也可以这种方式工作。顺便说一句,如果你想要使用null终止子字符串,你可以使用strtok作为你的任务。

为charcter函数参数设置整数类型是没有意义的:int character - > char character

答案 1 :(得分:0)

用'\ 0'替换字符可能会引起混淆。我会通过将下一个符合条件的角色转移到其位置来消除不良角色。

char *eliminate(char *str, int character) {
    if (!str) return str;

    int index = 0, shiftIndex = 0;
    while (str[index]) {
       if (str[index] == character) 
          index++;
       else {
          str[shiftIndex] = str[index];
          shiftIndex++, index++;
       }
    }
    str[shiftIndex] = '\0';
    return str;
}