сравнивая статический символ [] и константный символ * - PullRequest
2 голосов
/ 29 октября 2010
static char a[255] = "\0";
and
const char *b = " ";

Теперь, когда я назначаю "abc" для a и b, для a оставшиеся 252 байта остаются '\ 0', а для b это не так. Поэтому, когда я пытаюсь сравнить их, они оказываются разными. Одним из решений является сравнение до sizeof (b), как мы делаем в strncmp (). Есть ли другой способ сделать это? Вероятно, путем преобразования одного в другое?

Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 29 октября 2010

Это потому, что b не имеет «оставшиеся 252 байта». b создается как указатель на память, которая содержит два символа <space> и <nul> и ничего больше.

Когда вы назначаете на b, вы на самом деле меняете указатель на четыре символа a, b, c и <nul>, но после этого ничего не происходит что вы можете безопасно использовать.

strcmp - это общепринятый способ сравнения строк в C, несмотря на те типы * namby-pamby strncmp, которые говорят, что это небезопасно * a , но они не имеют правильного кодирования в C в первое место: -)


* a Это является небезопасным, если строки не могут заканчиваться нулем. Но опять же, если они не заканчиваются нулем, они технически не являются строками. Для обработки строк strcmp является правильным инструментом для работы.

1 голос
/ 29 октября 2010

Ну, во-первых, вы не хотите назначать "abc" для b.При изменении значения это приведет к утечке памяти со строками в стиле C.

Для сравнения вы хотите использовать функцию strcmp.Это в библиотеке.

...