Правильный способ очистить C-String

Я работаю над проектом на C, который требует от меня много возиться со строками. Обычно я программирую на C++, так что это немного отличается от простого выражения string.empty().

Мне интересно, как правильно очистить строку в C. Будет ли это так?

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

// ...

strcpy(buffer, "");

person Benjamin    schedule 12.11.2011    source источник
comment
Ваш пример сбивает с толку. Очевидно, буфер был объявлен где-то еще, и вы пытаетесь инициализировать его литералом. Здесь не нужно ничего очищать.   -  person pmr    schedule 13.11.2011
comment
string.empty() не изменяет строку   -  person David Heffernan    schedule 13.11.2011


Ответы (6)


Это зависит от того, что вы подразумеваете под «пустым». Если вам просто нужна строка нулевой длины, ваш пример будет работать.

Это также будет работать:

buffer[0] = '\0';

Если вы хотите обнулить все содержимое строки, вы можете сделать это следующим образом:

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

но это будет работать только для обнуления до первого символа NULL.

Если строка представляет собой статический массив, вы можете использовать:

memset(buffer,0,sizeof(buffer));
person Mysticial    schedule 12.11.2011
comment
Чтобы уточнить, последний метод будет работать, если buffer является массивом, но не будет работать, если это указатель. Компилятор должен иметь возможность видеть размер массива. Если buffer является указателем, он обнулит только размер указателя, возможно, 4 или 8 байтов. - person Tor Klingberg; 14.09.2015
comment
Этот ответ - stackoverflow.com/a/56048617/3114742 - обосновывает НИКОГДА не использование strlen с memset - используйте только sizeof - person Zach Smith; 08.05.2019

Два других способа: strcpy(str, ""); и string[0] = 0

Чтобы действительно удалить содержимое переменной (в случае, если у вас есть грязный код, который не работает должным образом с фрагментами выше: P), используйте цикл, как в примере ниже.

#include <string.h>

...

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

Если вы хотите очистить динамически выделенный массив символов с самого начала, вы можете либо использовать комбинацию malloc() и memset(), либо - и это намного быстрее - calloc(), который делает то же самое, что и malloc, но инициализирует весь массив с Null.

Наконец, я хочу, чтобы вы помнили о времени выполнения. Более того, если вы работаете с огромными массивами (6 цифр и выше), вы должны попытаться установить первое значение в Null вместо запуска memset() для всей строки.

Сначала это может выглядеть грязнее, но это намного быстрее. Вам просто нужно уделять больше внимания своему коду;)

Я надеюсь, что это было полезно для всех ;)

person Aiyion.Prime    schedule 03.04.2014

Зависит от того, что вы подразумеваете под опорожнением. Если вам просто нужна пустая строка, вы можете сделать

buffer[0] = 0;

Если вы хотите установить каждый элемент равным нулю, выполните

memset(buffer, 0, 80);
person Ben Ruijl    schedule 12.11.2011

Если вы пытаетесь очистить буфер приема для чего-то, что получает строки, я обнаружил, что лучший способ — использовать memset, как описано выше. Причина в том, что независимо от того, насколько велика следующая полученная строка (конечно, ограниченная размером буфера sizeof), она автоматически будет строкой asciiz, если будет записана в предварительно обнуленный буфер.

person Dave Tobias    schedule 12.01.2020

Я новичок, но... Насколько мне известно, лучший способ

strncpy(dest_string,"",strlen(dest_string));
person Eesh Kumar    schedule 04.06.2020
comment
Не используйте strncpy geeksforgeeks.org/ почему-strcpy-и-strncpy-небезопасно использовать - person fiscblog; 04.06.2020

требуется имя строки, и ее длина обнулит все символы, другие методы могут остановиться на первом нуле, с которым они столкнутся.

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