C Очистить переменную - PullRequest
       36

C Очистить переменную

3 голосов
/ 30 сентября 2010
char x [1000];
x = 'hello';
.....
 clear contents of x???

Что бы я использовал, чтобы очистить х? Я не могу переинициализировать его, использовать strcpy (x, '/ 0') или free ().

Ответы [ 4 ]

7 голосов
/ 30 сентября 2010

Вы не можете ничего присвоить массиву, которым является ваша переменная x. Поэтому все, что начинается с x =, неверно. Во-вторых, 'hello' - это не строка, это литерал с несколькими символами типа int, так что это тоже не имеет смысла. Строковый литерал заключен в ", тогда как символьные (или многозначные) литералы заключены в '.

Поэтому, если вы хотите заполнить свой буфер x строкой "hello", вы используете strncpy или даже лучше strlcpy, если доступно:

 strncpy( x, "hello", sizeof( x ) );
 strlcpy( x, "hello", sizeof( x ) );

Функция strlcpy лучше, потому что она всегда завершает строку символом nul.

Если вы хотите очистить его, вы можете сделать то, что предложили другие ответы. Я бы предложил использовать strncpy или strlcpy с пустой строкой, как предложено @codaddict. Это код, который наиболее очевидно говорит «эй, я хочу очистить эту строку». Если вы хотите удалить все содержимое строки из памяти (например, если она содержит пароль или что-то в этом роде), используйте memset, как @Ken и @Tom предложили.

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

5 голосов
/ 30 сентября 2010

Использование free() было бы неправильным, поскольку x находится в стеке.

Что вы подразумеваете под прозрачнымУстановить значение по умолчанию?Вы можете использовать memset?(Я копирую ваш код как есть)

#define CLEAR(x) memset(x,'\0',1000)

char x[1000];

x= 'hello';

CLEAR(x)

Если нет, вы всегда можете использовать цикл for.

2 голосов
/ 30 сентября 2010
x='hello';

может не выполнять то, что вы ожидаете, потому что ' обозначает символьную константу (или в данном случае многосимвольную константу) не строка.

Фактически, gcc не примет вышеуказанный код, жалуясь, что 'hello' слишком длинный (это на машине с 4 байтами int с), и что x = 'hell' является несовместимым назначением, потому что char[] не то же самое, что int.

Не должен

char x[1000];
x="hello";

работает, потому что вы не можете назначить массивы таким образом.

0 голосов
/ 30 сентября 2010

Если под «очистить» вы подразумеваете «очистить все биты в массиве», как на счет memset(x, '\0', 1000);?

...