2015-09-26 19 views
-1

我正在编写一个函数eliminate(char *str, int character),它将一个c字符串和一个字符作为输入消除,对character的实例进行扫描str,并用当前索引替换值。 .. 什么?我认为NULL,但这似乎有风险,可能会混淆依赖于C字符串中的空终止符的其他函数。例如:将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; 
} 

我的问题是,我该如何正确地实现这一功能,使得我有效地消除在字符串中指定字符的所有实例?如果适当的消除将分配给要被替换的字符,这如何不影响整个字符串(即,它有效地在遇到的第一个结束)。例如,如果我要在同一个字符串上运行上述函数两次,第二次调用将只检查字符串,直到最后一个字符被替换。

+4

你可能要重新考虑这个循环...好像它会永远运行... – Barry

+3

'NULL'不是一个char和永远不得用作一个整数值。大多数编译器将其定义为'(void *)0'。启用编译器警告并注意他们! – Olaf

+1

并选择一种语言。 – Olaf

回答

0

如果你知道自己在做什么,那么使用这种替换是很好的。

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

标准功能strtok也可以这种方式工作。顺便说一下,如果你想要以null结尾的子字符串,你可以使用strtok来完成你的任务。


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

+0

这并不总是可靠的,因为OP不会在实际放置终止符的地方存储更多的上下文。这取决于未显示的上下文。 – Olaf

+0

@Olaf什么是不可靠的? OP想用'\ 0'代替某个字符。问题在空字符结尾的C字符串的上下文中提出。所以,我认为作者想要以某个分隔符标记空终止的子字符串。当然,它改变了原来的缓冲区,所以像'strtok'一样,缓冲区不能像以前那样用于初始字符串。 –

+0

看看'strtok'和它为什么不是线程安全的。那么你可能会看到不同之处。 – Olaf

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; 
}