Я пишу функцию 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'
). Например, если бы я дважды запускал вышеуказанную функцию для одной и той же строки, второй вызов просматривал бы строку только до того места, где был заменен последний символ.
NULL
не является символом и никогда не должен использоваться как целочисленное значение. Большинство компиляторов определяют его как(void *)0
. Включите предупреждения компилятора и обратите на них внимание! - person too honest for this site   schedule 26.09.2015NUL
нет, и OP четко пишетNULL
. - person too honest for this site   schedule 26.09.2015NULL
определено как0
в C++, его не следует использовать как целое число (и больше не как константу нулевого указателя. C++11 представилnullptr
по уважительным причинам) - person too honest for this site   schedule 26.09.2015strtok
. Простая замена не позволит вызывающей стороне определить фактический конец строки, если только она не хранит информацию об исходной длине. Нет проблем, если его нужно укоротить, но показания противоположны. - person too honest for this site   schedule 26.09.2015RemoveChars
. - person Orest Hera   schedule 26.09.2015