Строки в C не знают своей длины, они просто указатели. Строки должны заканчиваться нулевым символом, чтобы такие функции, как printf
и strlen
знали, когда следует остановиться.
char even[SIZE];
char odd[SIZE];
На данный момент even
и odd
оба содержат любой мусор, который был в памяти в то время.
for(int i=0;i<length;i+=2){
even[i/2]=message[i];
}
for(int i=1;i<length;i+=2){
odd[j]=message[i];
j++;
}
Теперь начало odd
и even
заполнено, но они не были завершены нулем.
printf("The even letters are: %s\n",even);
printf("The odd letters are: %s\n",odd);
Они начнутся там, где указывают even
и odd
, напечатают введенные вами символы, а затем продолжат печатать любой мусор, который был в памяти, до тех пор, пока они не попадут в нулевой символ.
Исправлено либо обнуление памяти с помощью memset
.
memset(even, '\0', SIZE);
memset(odd, '\0', SIZE);
Или убедитесь, что even
и odd
завершены нулем, как только вы закончите с ними.
for(i=0;i<length;i+=2){
even[i/2]=message[i];
}
even[i/2] = '\0';
for(i=1;i<length;i+=2){
odd[j]=message[i];
j++;
}
odd[j] = '\0';
Примечание: петли even
и odd
могут быть выполнены одним и тем же методом.
for( i=0,j=0; i<length; i+=2,j++ ) {
even[j]=message[i];
}
even[j] = '\0';
for( i=1,j=0; i<length; i+=2,j++ ) {
odd[j]=message[i];
}
odd[j] = '\0';
Тогда мы можем заметить, что единственная разница в том, где мы начинаем читать message
. Это означает, что мы можем поместить это в функцию и всегда помнить, что нулевое завершение результата.
void copy_every_other_character(const char *src, char *dst) {
int i,j,length = 0;
length = strlen(src);
for( i=0,j=0; i<length; i+=2,j++ ) {
dst[j] = src[i];
}
dst[j] = '\0';
}
copy_every_other_character(message, even);
copy_every_other_character(message+1, odd);
Добавление 1 к message
означает, что copy_every_other_character
получит указатель на второй символ message
и продолжит оттуда. Если message
равно 01234
, он увидит 1234
.