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.

Intentando copiar una cadena en un array de tipo const char * en C.

Estoy tratando de convertir una cadena en C (usando la biblioteca string.h) en un arreglo constante de caracteres.

int len = sizeof(the_string);
const char *char_array = malloc(len);
strcpy(char_array, the_string);

He revisado el archivo de métodos de string.h y lo he buscado en Google, pero todo lo que encuentro es en C++. Cualquier consejo sería muy apreciado, ¡gracias!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    En primer lugar, tenga en cuenta que sizeof devuelve el tamaño en bytes del argumento, que no es la longitud de la cadena. Para obtener la longitud de la cadena, utilice strlen(the_string) en su lugar.

    Para convertir una cadena en C utilizando la biblioteca string.h en un array const char, puede asignar memoria para el array de char utilizando strlen(the_string) + 1 para tener en cuenta el terminador nulo de la cadena. Luego puede copiar el contenido de la cadena en el array de char utilizando strncpy(char_array, the_string, len) para asegurarse de que se copien solo len caracteres.

    Aquí tienes un ejemplo de solución:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main() {
      char* the_string = "hello world";
      int len = strlen(the_string) + 1;
      const char* char_array = malloc(len * sizeof(char));
      strncpy(char_array, the_string, len);
    
      printf("Cadena: '%s'\n", the_string);
      printf("Array de char: '%s'\n", char_array);
    
      free((void*)char_array);
      return 0;
    }
    

    Este programa asigna memoria para el array de char, copia el contenido de la cadena en el array y luego imprime tanto la cadena original como el array de char. Tenga en cuenta que convertimos el puntero devuelto por malloc a void* antes de pasarlo a free. Esto se debe a que free toma un argumento void* y hacer la conversión explícita evita ciertas advertencias del compilador.</string.h></stdlib.h></stdio.h>

Comments are closed.