Как это возможно, что длина этой строки увеличивается? - PullRequest
1 голос
/ 08 сентября 2011
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char * odd(const char * S, char * dest);

int main()
{
    char * source = "abcdefghijklmnopacegiacegi";
    unsigned int length = strlen(source);
    char dest[length];
    printf("%s\n",odd(source, dest));
}

char * odd(const char * source, char * dest)
{
    int count = 0;
    unsigned int length = strlen(source);
    for(int i = 0; i < length; i++)
    {
        if( (source[i] %2 )!= 0)
        {
            dest[count] = source[i];
            count++;
        }
    }
    return dest;
}

размер dest увеличивается и создает мусор для любых значений после длины источника

Ответы [ 3 ]

4 голосов
/ 08 сентября 2011

Вы должны вручную добавить конец \0 в строку, то есть, в конце add, вы должны добавить:

dest[count] = '\0';

Знаете, длина строки в C учитывается при поиске символа \0. Вы должны включить один из них в конце каждой строки C. Если нет, строка может содержать любой мусор до первой \0, которая будет напечатана.

Наконец, при создании dest вы также должны увеличить длину зарезервированного пространства в одном, чтобы вместить этот конечный символ 0. strlen не учитывает этот конечный символ 0.

2 голосов
/ 08 сентября 2011

Ваша odd функция забывает об окончании NUL dest, поэтому printf продолжает счастливо читать после намеченного конца строки, выводя мусор, который оказывается в стеке.

Кроме того, dest должен быть на один символ длиннее, поскольку strlen сообщает длину строки , не включая закрывающий NUL, таким образом, если source является случайно всем нечетным символом, у вас (небольшое) переполнение буфера.

1 голос
/ 08 сентября 2011

Вы не копируете завершающий \0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...