es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Concatenar matrices de caracteres utilizando strcat.

Estoy trabajando en un pequeño algoritmo de encriptación que hace lo siguiente:

conversión:

input = 356307042441013    a output = 333536333037303432343431303133

y funciona así:
si un número es igual a 3, lo cambia por 333, excepto si está en la última posición de la cadena.
si no, agregamos 3 entre cada par de números que son diferentes de 3.

input = 3 5 6 3 0 7 0 4 2 4 4 1 0 1 3
a
output = 333 5 3 6 333 0 3 7 3 0 3 4 3 2 3 4 3 4 3 1 3 0 3 1 3 3

Para hacerlo, escribí este código:

int main() {
const char *imei = “362162356836934568”;
char *imei_buffer;
strcpy(imei_buffer,’\0′);

int i = 0;
while (i < strlen(imei))
{
if (i <= (strlen(imei) – 1))
{
if (imei[i] == ‘3’)
{
strcat(imei_buffer, “333”);
}
else if ((imei[i] != ‘3’) && (imei[i + 1] == ‘3’))
{
strcat(imei_buffer, &imei[i]);
//strcat(imei_buffer,’3′);
}
else if ((imei[i] != ‘3’) && (imei[i + 1] != ‘3’))
{
strcat(imei_buffer, &imei[i]);
strcat(imei_buffer, “3”);
}
}
else if (i == strlen(imei))
{
if (imei[i] == ‘3’)
{
strcat(imei_buffer, “333”);
}
else if (imei[i] != ‘3’)
{
else if (i == strlen(imei))
{
strcat(imei_buffer, &imei[i]);
//strcat(imei_buffer,’3′);
}
i++;
}

printf("imei_buffer : %s",imei_buffer);

return 0;

}

El código se ejecuta sin errores, pero no muestra ningún resultado al final.

¿Dónde podría haber cometido un error en esta implementación?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Hay algunos problemas potenciales en esta implementación:

    1. imei_buffer no está siendo asignado memoria antes de ser utilizado con strcpy y strcat. Esto puede causar un comportamiento indefinido y podría ser la razón de la falta de resultado. La memoria debería ser asignada dinámicamente con malloc antes de utilizar el buffer.
    2. Las declaraciones condicionales en el bucle while verifican i <= (strlen(imei) - 1) y i == strlen(imei). Esto omitirá por completo el último dígito en imei. La primera condición debería cambiarse a i < strlen(imei) para incluir el último dígito en el bucle.

    3. En la segunda declaración else if, se está utilizando & en lugar de &. Esto causará un error de compilación.

    Para solucionar estos problemas, el código podría modificarse de la siguiente manera:

    int main() {
        const char *imei = "362162356836934568";
        char *imei_buffer = (char*) malloc(sizeof(char) * (strlen(imei)*2 + 1));
        strcpy(imei_buffer,"");
    
        int i = 0;
        while (i < strlen(imei))
        {
            if (i < (strlen(imei) - 1))
            {
                if (imei[i] == '3')
                {
                    strcat(imei_buffer, "333");
                }
                else if ((imei[i] != '3') && (imei[i + 1] == '3'))
                {
                    strncat(imei_buffer,&imei[i],1);
                    strcat(imei_buffer,"3");
                }
                else if ((imei[i] != '3') && (imei[i + 1] != '3'))
                {
                    strncat(imei_buffer,&imei[i],1);
                    strcat(imei_buffer, "3");
                }
            }
            else if (i == (strlen(imei) - 1))
            {
                if (imei[i] == '3')
                {
                    strcat(imei_buffer, "333");
                }
                else if (imei[i] != '3')
                {
                    strncat(imei_buffer,&imei[i],1);
                }
            }
            i++;
        }
    
        printf("imei_buffer : %s",imei_buffer);
        free(imei_buffer);
        return 0;
    }
    

    Este código debería asignar un buffer con una longitud suficiente para el resultado, corregir las declaraciones condicionales para incluir el último dígito y utilizar la sintaxis correcta en la segunda declaración else if.

Comments are closed.