-1

我正在编写一个函数eliminate(char *str, int character),它需要一个 c 字符串和一个要消除的字符作为输入,扫描str实例character并将当前索引处的值替换为......什么?我想NULL,但这似乎有风险,并且可能会与其他依赖于 c 字符串中的空终止符的函数混淆。例如:

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'遇到时结束)。例如,如果我在同一个字符串上运行上述函数两次,第二次调用将只检查字符串直到最后一个字符被替换的位置。

4

2 回答 2

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;
}
于 2015-09-26T21:00:01.133 回答
0

如果您知道自己在做什么,则可以使用此类替换。

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

标准功能strtok也以这种方式工作。顺便说一句,strtok如果您想要以空字符结尾的子字符串,您可能可以将其用于您的任务。


字符函数参数的整数类型没有意义:int character->char character

于 2015-09-26T19:49:41.813 回答