В общем, этот код:
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
.
Hi. почему вы считаете, что это не должно работать? \ –
Какую часть вы не понимаете? – juanchopanza
Привет, я не уверен, как * p можно использовать в качестве второго параметра в цикле for и как цикл знает, чтобы положить конец – Dave