#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
.