2015-06-05 2 views
5

Я довольно новыми для программирования и было просто интересно, почему по этому коду:Как "for (; * p; ++ p) * p = tolower (* p);" работа в c?

for (; *p; ++p) *p = tolower(*p); 

работает, чтобы опустить строку случай с, когда р указывает на строку?

+0

Hi. почему вы считаете, что это не должно работать? \ –

+1

Какую часть вы не понимаете? – juanchopanza

+0

Привет, я не уверен, как * p можно использовать в качестве второго параметра в цикле for и как цикл знает, чтобы положить конец – Dave

ответ

2

Чтобы отказаться, допустим, p является указателем на char и непосредственно перед циклом for, он указывает на первый символ в строке.

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

*p будет оцениваться как 0 после строки null-terminator. Затем цикл for выйдет. (Второе выражение в цикле for действует как тест завершения).

++p Переход к следующему символу в строке.

*p = tolower(*p) устанавливает этот символ в нижний регистр.

+0

А это тот бит, которого я не знал, поэтому по умолчанию условие цикла for - это если второй параметр равен 0, то он выйдет? – Dave

+0

Действительно, второе выражение в цикле 'for' - это тест завершения. – Bathsheba

3

В общем, этот код:

for (; *p; ++p) *p = tolower(*p); 

делает не

работает, чтобы опустить строку случай с, когда р указывает на строку?

Это делает работу для чистого ASCII, но так как char обычно является знаковым типом, и поскольку tolower требует неотрицательного аргумента (за исключение особого значения EOF), часть будет вообще иметь неопределенное поведение.

Чтобы избежать этого, бросить аргумент unsigned char, как это:

for (; *p; ++p) *p = tolower((unsigned char)*p); 

Теперь он может работать для одного байтовых кодировок, как Latin-1, при условии, что вы установили правильную локаль через setlocale, например, setlocale(LC_ALL, "");. Однако обратите внимание, что очень распространенная кодировка UTF-8 - это не один байт на символ. Для обработки текста UTF-8 вы можете преобразовать его в широкую строку и в нижний регистр.


Детали:

  • *p это выражение, которое обозначает объект, который указывает на p, предположительно char.

  • В качестве условия продолжения для цикла for, любое ненулевой char значения, которое *p обозначает, имеет эффект логических Правда, в то время как нулевое значение char в конце строки имеет эффект логических Ложные, окончание петля.

  • ++p Продвигает указатель, чтобы указать на следующее char.

+0

Это все немного впереди, где я, но я постараюсь сесть, чтобы понять это, ура! – Dave

+0

+1 для того, чтобы быть разборчивым (что хорошо, особенно в C) и для упоминания кодировок, так что OP помнит, что они вокруг. – dummydev

Смежные вопросы