Как сбросить строку в C - PullRequest
       1

Как сбросить строку в C

0 голосов
/ 27 декабря 2018

Итак, у меня есть эта строка char currentString [212] = {0};

, и после того, как я ее использую один раз, я хочу сбросить ее.Я использую много способов, таких как:

for (int k = 0; k < strlen(currentString); k++)
{
    currentString[k] = '\0';
}

, но он не пройдет цикл более одного раза, и он дает '\ 0' только первому символу, остальные остаются неизменными.

и я тоже попробовал:

currentString[0] = '\0';

но я получаю тот же результат.

есть предложения, что я могу сделать?спасибо!

Ответы [ 5 ]

0 голосов
/ 27 декабря 2018

Никогда не стоит рассчитывать что-либо снова и снова.Вместо этого вы должны вычислить strlen () только один раз.Тем не менее, в вашем случае, решение этой проблемы решит проблему, поскольку причина, по которой это не сработало, заключается в том, что strlen () вернул 0 сразу после первого раунда, поскольку длина строки стала 0.

int n = strlen(currentString);
for (int k = 0; k < n; k++)
{
    currentString[k] = '\0';
}
0 голосов
/ 27 декабря 2018

Установка первого байта равным '\ 0' не очистит currentString. Вы можете подумать, что, поскольку ANSI C считает, что это терминатор строки, и если вы напечатаете вашу строку, она покажет пустой. Но если вы проверите второй байт, выувидим второй символ из вашей строки.Как уже говорилось, лучший способ стереть строку:

memset(currentString, 0, sizeof(currentString));

И намного безопаснее и быстрее. Также в ANSI C 0 и '\ 0' одинаковы.

0 голосов
/ 27 декабря 2018

Представьте себе char currentString[] = "abc"; и затем запустите ваш цикл:

  • k = 0
  • initialy strlen(currentString) = 3, перед байтом '\ 0' есть 3 символа.условие цикла k < strlen(currentString) истинно
  • k = 0 -> currentString[0] = '\0'
  • k++ -> k = 1
  • , затем strlen(currentString) = 0 (в качестве первогобайт currentString равен '\ 0', перед '\ 0' нет символов)
  • условие цикла ложно k < strlen(currentString) -> 1 < 0

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

Если вы хотите записать только нулевые байты в область памяти, используйте memset

 memset(currentString, 0, sizeof(currentString));

, чтобы установить область памяти, как указаноcurrentString указатель с sizeof(currentString) байтами на нули.

Установка первого байта в ноль:

 currentString[0] = '\0';

может считаться достаточным для "очистки строки".

0 голосов
/ 27 декабря 2018

для обнуления всего массива

char arr[SOMESIZE];

/* ... */

memset(arr, 0, sizeof(arr));

указатель - вам нужно знать размер выделенной памяти, так как sizeof будет возвращать только размер самого указателя, а не ссылочного объекта;

char *p = malloc(SIZE);
/* ..... */
memset(p, 0 , SIZE);
0 голосов
/ 27 декабря 2018

strlen найдет длину путем поиска первого вхождения \0.Поэтому, если вы хотите сбросить весь массив, вы должны изменить strlen(currentString) на sizeof currentString.Однако обратите внимание, что это не будет работать с указателями.

Если вы передадите массив функции, вы не сможете определить размер массива впоследствии, поэтому это не будет работать:

void foo(char * arr) {
    for (int k = 0; k < sizeof arr; k++) 
        arr[k] = '\0';
}

Вместо этого вам нужно сделать так:

void foo(char * arr, size_t size) {
    for (int k = 0; k < size; k++) 
        arr[k] = '\0';
}

Но, конечно, нет смысла писать для этого пользовательские функции, когда memset доступен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...