Каков наилучший способ очистить строку символов в C? - PullRequest
0 голосов
/ 11 декабря 2011

Привет, у меня есть строка символов

name[50] = "I love programming"

, что происходит, когда я хочу очистить эту строку перед вызовом другой функции, чтобы я мог что-то сохранить в том же массиве

будет ли это работать?

name[0] = '\0';

или все-таки можно очистить строку без создания какой-либо новой функции или использования какой-либо другой библиотеки?

Ответы [ 7 ]

5 голосов
/ 11 декабря 2011

Установка первого символа в nul вполне приемлема. Но если эта строка была чувствительной с точки зрения безопасности, то вы должны обнулить ее с помощью memset.

Edit:

Ответ от Matteo Italia заставил меня углубиться в эту тему. Согласно этот документ (и ответ Маттеоса) memset можно было бы оптимизировать, и поэтому это не лучший вариант для удаления конфиденциальной информации из памяти. Документ имеет несколько вариантов, но ни один из них не является переносимым и надежным, поэтому он предлагает новый стандарт функций memset_s как раз для таких целей. Эта функция еще не существует, поэтому в настоящее время мы застряли с непереносимыми (SecureZeroMemory), ненадежными (volatile трюк) или неоптимальными параметрами (secure_memset пример).

3 голосов
/ 11 декабря 2011

На самом деле нет концепции очистки строки символов в C. Это просто указатель, который указывает на некоторую выделенную память.Вы можете использовать эту память любым удобным для вас способом, не «опустошая» ее в первую очередь.Итак, самый простой способ очистить его - просто не делать.

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

Если вы хотите «очистить» его в том смысле, что при печати ничего не будет напечатано, тогда да, просто установите первый символ в «\ 0».


В заключениеВсе зависит от того, что вы действительно хотите сделать. Почему вы хотите "очистить" строку?

2 голосов
/ 11 декабря 2011

Используйте взамен memset .Это просто аннулирует буфер, но выделенная память будет любым способом, как освобождается из стека, когда переменная выходит из области видимости.

memset (name,'\0',sizeof(name));
1 голос
/ 11 декабря 2011

Это зависит от эффекта, который вы хотите получить. Если вы просто хотите обнулить его длину, вы можете сделать, как вы сказали:

*name='\0';

Если вместо этого вы хотите очистить строку от конфиденциальных данных, вам следует полностью обнулить ее с помощью memset (в некоторых операционных системах также есть «безопасная» функция обнуления, которая не должна быть оптимизирована компилятором. - см., например, SecureZeroMemory в Windows).

С другой стороны, если функция, которую вы вызываете, просто использует буфер, который вы передаете, в качестве выходного буфера независимо от его содержимого, вы можете просто оставить буфер как есть.

1 голос
/ 11 декабря 2011
memset(name, 0, 50); 

или

bzero(name, 50);
1 голос
/ 11 декабря 2011

Технически это правильно, например:

char array[10] = "hello";
printf("%d\r\n", strlen(array)); // prints 5
array[0] = '\0';
printf("%d\r\n", strlen(array)); // prints 0
1 голос
/ 11 декабря 2011

IIRC, вы можете использовать memset следующим образом:

char * myString;
...
size_t len = strlen(myString)
memset (myString, 0,len);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...