¿Cómo es posible que la longitud de esta cadena esté aumentando?

#include  #include  #include  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; } 

el tamaño de dest aumenta y produce basura para cualquier valor después de la longitud de la fuente

Debe incluir manualmente el final \0 en la cadena, es decir, al final de la add , debe agregar:

 dest[count] = '\0'; 

Ya sabes, la longitud de las cadenas en C se contabiliza buscando el carácter \0 . Debes incluir uno de esos al final de cada cadena C. De lo contrario, la cadena puede contener cualquier basura hasta el primer \0 que se imprimirá.

Finalmente, al crear dest , también debe boost la longitud del espacio reservado en uno para acomodar ese carácter de 0 final. El strlen no cuenta ese carácter de final 0.

Su función odd olvida de terminar con NUL, por lo que printf continúa leyendo felizmente más allá del final previsto de la cadena, generando la basura que está en la stack.

Además, dest debe ser un carácter más largo, ya que strlen indica la longitud de la cadena sin incluir el NUL de cierre, por lo tanto, si la source es por casualidad todos los caracteres impares, tiene un desbordamiento de búfer (pequeño).

No copie la terminación \0 .