Есть встроенная функция для очистки строки в c? - PullRequest
0 голосов
/ 12 марта 2019

Я новичок в программировании, поэтому очень мало знаю о библиотеках Си. Проблема - у меня есть строка temp, я хочу очистить ее и сохранить новую строку в temp. Есть ли какая-либо встроенная функция в C для очистки строки, как clear() в C ++?

Ответы [ 3 ]

3 голосов
/ 12 марта 2019

В C строка представляет собой массив char, и конец строки отмечен символом NUL (он же '\0'), который является ничем иным, как байтом значения 0.

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

temp[0] = '\0';

или

*temp = '\0';

то же самое.

Если вы определили что-то вроде

char temp[100];

Вы могли бы также сделать

memset(temp, '\0', sizeof temp);

Это перезапишет все символы, что позволит вам вводить новые данные символ за символом, не заботясь о прекращении '\0'.

При динамическом размещении ответ будет другим.

Это немного зависит от того, как вы хотите назначить новое значение для temp, но, как правило, нет необходимости очищать старое значение перед назначением нового значения.

1 голос
/ 12 марта 2019

В Си строка представляет собой последовательность последовательных char переменных, оканчивающихся представлением нуля в виде символа, '\0'.

Это значение действует как часовой для концаstring и допускает приведенный ниже идиоматический цикл «обработки строки»:

char *p = <some string>;
while(*p)
{
    dosomething(*p);
    p++;
}

Библиотечные функции, обрабатывающие строки (т. е. strlen, strcpy, strcat и т. д.), используют конструкцию, аналогичную кодувыше, и когда вы пишете свой собственный код, который обрабатывает произвольные строки, вы найдете проверку пустых символов полезной;даже если строка хранится в массиве char [] известной длины, она передается в указатель на свой первый элемент при передаче в функцию, теряя информацию о ее длине.

Итак, если вы хотите очиститьстрока, все что нужно, это установить первый элемент строки в '\0'.Если первое значение в строке - нулевой терминатор, условие *p ложно и цикл никогда не вводится:

char *p = "\0someotherstuff";
printf("%zu\n", strlen(p));
// Output: 0
0 голосов
/ 12 марта 2019

Если вам нужно «безопасно стереть» данные, memset (stringname, 0, strlen(stringname)); удалит текущее содержимое. Но если вы уже очистили строку, установив для 1-го символа значение 0, она не будет работать, поскольку длина строки уже равна 0.

Для очистки строк пароля в структурах и т. Д. Безопаснее сохранить полную длину строки и всегда вызывать memset (stringname, 0, fullstringlength);

Если вы просто хотите записать новый контент в temp, вам даже не нужно сначала его чистить. strcpy (temp, "the_new_content"); будет работать. Но иногда чистка полезна:

void AddToLog (char* news)
{
  strcat (temp, news); //Append new part
  if (strlen (temp) >= worth_saving) //Log is long enough
  {
    FlushLog(temp);  //Write it somewhere
    temp[0]=0;      //Empty the log
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...