Как заменить символ в строке с 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