Массив символа* должен закончиться в '\0' или “\\0”?

Я - Java-разработчик, но я думаю, что это - то же для c#.

я никогда не представляю свойства частной коллекции, потому что другие части программы могут изменить его без родителя, замечающего, так, чтобы в методе получателя я возвратил массив с объектами набора, и в методе установщика я звоню clearAll() по набору и затем addAll()

15
задан Andrew-Dufresne 27 September 2009 в 10:23
поделиться

6 ответов

Я бы закончил его NULL . Почему? Потому что вы не можете сделать ни одно из этих действий:

array[index] == '\0'
array[index] == "\0"

Первый - это сравнение char * с char , что не то, что вы хотите. Вам придется сделать следующее:

array[index][0] == '\0'

Второй даже не работает. Вы сравниваете char * с char * , да, но это сравнение бессмысленно. Он проходит, если два указателя указывают на один и тот же фрагмент памяти. Вы не можете использовать == для сравнения двух строк, вы должны использовать функцию strcmp () , потому что C не имеет встроенной поддержки строк, кроме нескольких (и Я имею в виду несколько) синтаксических тонкостей. В то время как следующее:

array[index] == NULL

Прекрасно работает и передает вашу точку зрения.

28
ответ дан 1 December 2019 в 00:50
поделиться

According to the C99 spec,

  • NULL expands to a null pointer constant, which is not required to be, but typically is of type void *
  • '\0' is a character constant; character constants are of type int, so it's equivalen to plain 0
  • "\0" is a null-terminated string literal and equivalent to the compound literal (char [2]){ 0, 0 }

NULL, '\0' and 0 are all null pointer constants, so they'll all yield null pointers on conversion, whereas "\0" yields a non-null char * (which should be treated as const as modification is undefined); as this pointer may be different for each occurence of the literal, it can't be used as sentinel value.

Although you may use any integer constant expression of value 0 as a null pointer constant (eg '\0' or sizeof foo - sizeof foo + (int)0.0), you should use NULL to make your intentions clear.

7
ответ дан 1 December 2019 в 00:50
поделиться

Of these two, the first one is a type mistake: '\0' is a character, not a pointer. The compiler still accepts it because it can convert it to a pointer.

The second one "works" only by coincidence. "\0" is a string literal of two characters. If those occur in multiple places in the source file, the compiler may, but need not, make them identical.

So the proper way to write the first one is

char* array[] = { "abc", "def", NULL };

and you test for array[index]==NULL. The proper way to test for the second one is array[index][0]=='\0'; you may also drop the '\0' in the string (i.e. spell it as "") since that will already include a null byte.

6
ответ дан 1 December 2019 в 00:50
поделиться

Well, technically '\0' is a character while "\0" is a string, so if you're checking for the null termination character the former is correct. However, as Chris Lutz points out in his answer, your comparison won't work in it's current form.

1
ответ дан 1 December 2019 в 00:50
поделиться

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

0
ответ дан 1 December 2019 в 00:50
поделиться

Нулевое завершение - плохой шаблон проектирования, лучше оставить его в учебниках истории. За c-струнами по-прежнему много инерции, так что там ее не избежать. Но нет причин использовать его в примере OP.

Не используйте терминатор, а используйте sizeof (array) / sizeof (array [0]), чтобы получить количество элементов.

0
ответ дан 1 December 2019 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: