Manera correcta de vaciar un C-String

3 minutos de lectura

He estado trabajando en un proyecto en C que requiere que juegue mucho con las cadenas. Normalmente, programo en C++, así que esto es un poco diferente a simplemente decir string.empty().

Me pregunto cuál sería la forma correcta de vaciar una cadena en C. ¿Sería esta?

buffer[80] = "Hello World!\n";

// ...

strcpy(buffer, "");

  • Tu ejemplo es confuso. Aparentemente, el búfer se ha declarado en otro lugar e intenta inicializarlo desde un literal. No hay necesidad de borrar nada aquí.

    – pmr

    12 de noviembre de 2011 a las 21:55

  • string.empty() no modifica la cadena

    –David Heffernan

    12 de noviembre de 2011 a las 21:57

Depende de lo que entiendas por “vacío”. Si solo desea una cadena de longitud cero, entonces su ejemplo funcionará.

Esto también funcionará:

buffer[0] = '\0';

Si desea poner a cero todo el contenido de la cadena, puede hacerlo de esta manera:

memset(buffer,0,strlen(buffer));

pero esto solo funcionará para poner a cero hasta el primer carácter NULL.

Si la cadena es una matriz estática, puede usar:

memset(buffer,0,sizeof(buffer));

  • Para aclarar, el último método funcionará si buffer es una matriz, pero no si es un puntero. El compilador debe poder ver el tamaño de la matriz. Si buffer es un puntero, solo pondrá a cero el tamaño de un puntero, probablemente 4 u 8 bytes.

    –Tor Klingberg

    14/09/2015 a las 15:26

  • Esta respuesta – stackoverflow.com/a/56048617/3114742 – defiende NUNCA usar strlen con memset – uso único sizeof

    – Zach Smith

    8 mayo 2019 a las 20:40

Otras dos formas son strcpy(str, ""); y string[0] = 0

Para eliminar realmente el contenido de la variable (en caso de que tenga un código sucio que no funcione correctamente con los fragmentos de código anteriores: P), use un ciclo como en el ejemplo a continuación.

#include <string.h>

...

int i=0;
for(i=0;i<strlen(string);i++)
{
    string[i] = 0;
}

En caso de que desee borrar una matriz de caracteres asignada dinámicamente desde el principio, puede usar una combinación de malloc() y memset() o, y esto es mucho más rápido, calloc() que hace lo mismo que malloc pero inicializando toda la matriz con Null.

Por fin quiero que tengas en mente tu tiempo de ejecución. Aún más, si está manejando matrices enormes (6 dígitos y más), debe intentar establecer el primer valor en Nulo en lugar de ejecutar memset() a través de toda la cadena.

Puede parecer más sucio al principio, pero es mucho más rápido. Solo necesita prestar más atención a su código;)

Espero que esto haya sido útil para alguien;)

Depende de lo que entiendas por vaciar. Si solo quieres una cadena vacía, puedes hacerlo

buffer[0] = 0;

Si desea establecer cada elemento a cero, haga

memset(buffer, 0, 80);

Si está tratando de borrar un búfer de recepción para algo que recibe cadenas, he encontrado que la mejor manera es usar memset como se describe anteriormente. La razón es que no importa qué tan grande sea la siguiente cadena recibida (limitada al tamaño del búfer, por supuesto), automáticamente será una cadena asciiz si se escribe en un búfer que ha sido puesto a cero previamente.

Soy un principiante pero… Hasta donde yo sé, la mejor manera es

strncpy(dest_string,"",strlen(dest_string));

Manera correcta de vaciar un C String
Denés Borsos

necesita el nombre de la cadena y su longitud pondrá a cero todos los caracteres; otros métodos podrían detenerse en el primer cero que encuentren

    void strClear(char p[],u8 len){u8 i=0; 
        if(len){while(i<len){p[i]=0;i++;}}
    }

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad