2015-09-26 2 views
-1

Я пишу функцию eliminate(char *str, int character), которая берет c-строку и символ для исключения в качестве входных данных, сканирует str для экземпляров character и заменяет значение в текущем индексе. .. какие? Я думал, 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; 
} 

Мой вопрос, как я правильно реализовать эту функцию таким образом, что я фактически устраняет все экземпляры указанного символа в строке? И если надлежащее устранение назначает '\0' символу, который нужно заменить, как это не влияет на всю строку (то есть, она фактически заканчивается на первом). Например, если бы я дважды запускал указанную выше функцию в той же строке, второй вызов будет рассматривать только строку до того места, где был заменен последний символ.

+4

Вы можете пересмотреть эту петлю ... кажется, что он будет работать вечно ... – Barry

+3

'NULL' не символ и никогда не должны быть использованы как целое значение. Большинство компиляторов определяют его '(void *) 0'. Включите предупреждения компилятора и обратите внимание на них! – Olaf

+1

И выберите один язык. – Olaf

ответ

0

Прекрасно использовать такую ​​замену, если вы знаете, что делаете.

Он может работать только тогда, когда символ буфера char *str доступен для записи (динамически выделяется, например, путем malloc, или просто массив символов в стеке char str[SIZE]). Он не может работать для строковых литералов.

Стандартная функция strtok также работает таким образом. Кстати, возможно, вы можете использовать strtok для своей задачи, если хотите иметь нулевую завершенную подстроку.


Это не имеет смысла иметь целочисленный тип для charcter аргумента функции: 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; 
}