Как заменить символ в строке с NULL в ANSI C?

Я хочу заменить все символы "a" в строке в ANSI C. Вот мой код:

#include <stdio.h>
#include <stdlib.h>

void sos(char *dst){
    while(*dst){
        if(*dst == 'a')
        *dst = '\0';
        dst++;
        }
}


int main(void){
    char str[20] = "pasternak";
    sos(str);
    printf("str2 = %s \n", str);
    return 0;
}

Когда я запускаю его, результат:

str2 = p

Но это должно быть

str2 = psternk

Он отлично работает с другими символами, такими как 'b' и т. Д. Я пытался присвоить NULL *dst, но я получил ошибку во время компиляции.
Как я могу удалить символы "а" сейчас?

4 ответа

Решение

'\0' так инструменты языка C распознают конец строки. Чтобы действительно удалить персонажа, вам нужно сдвинуть все последующие символы вперед.

void sos(char *dst) {
  int offset = 0;
  do {
    while (dst[offset] == 'a') ++offset;
    *dst = dst[offset];
  } while (*dst++);
}

В C строки заканчиваются нулями, это означает, что когда есть '\0' в строке это конец строки.

Итак, вы делите строку на 3 разных:

p
stern
k

Если вы хотите удалить a Вы должны переместить все символы после a одна позиция.

Что делает printf: читает байты до '\0' найден.

Ты превратился "pasternak" в "p\0astern\0k"так что printf печатает p,

Это соглашение используется в строковых функциях stdlib, поэтому вам не нужно передавать длину строки в качестве аргумента.

Вот почему сказано, что в C строки заканчиваются нулем: это просто соглашение, за которым следует C stdlib.

Недостатком, как вы обнаружили, является то, что строки не могут содержать \0,

Если вы действительно хотите напечатать заданное количество байтов, используйте что-то вроде fwrite, который подсчитывает количество байтов для печати, так что он может напечатать \0,

Приведенные ранее ответы идеально подходят для объяснения того, почему ваш код не работает. Но вы можете попытаться использовать strtok, чтобы разбить строку на основе символов "а", а затем соединить части вместе или просто напечатать их appart. Проверьте этот пример: http://www.tutorialspoint.com/c_standard_library/c_function_strtok.htm

Другие вопросы по тегам