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