Как преобразовать строку со смешанным регистром в строку в нижнем регистре на C?
strlwr((char*)str);
Он просто перебирает строку и сам ее преобразует.
Как преобразовать строку со смешанным регистром в строку в нижнем регистре на C?
strlwr((char*)str);
Он просто перебирает строку и сам ее преобразует.
Ответы:
Он находится в стандартной библиотеке, и это самый простой способ реализовать такую функцию. Так что да, просто переберите строку и преобразуйте каждый символ в нижний регистр.
Что-то вроде этого банального:
#include <ctype.h>
for(int i = 0; str[i]; i++){
str[i] = tolower(str[i]);
}
или, если вы предпочитаете один лайнер, вы можете использовать этот от JF Sebastian:
for ( ; *p; ++p) *p = tolower(*p);
for ( ; *p; ++p) *p = tolower(*p);
кажется более идиоматичным.
char *
, но не если str является массивом char. Есть какое-нибудь объяснение этому?
преобразование в нижний регистр эквивалентно увеличению бита 0x60, если вы ограничиваете себя ASCII:
for(char *p = pstr; *p; ++p)
*p = *p > 0x40 && *p < 0x5b ? *p | 0x60 : *p;
for(char *p = pstr;*p;++p) *p=*p>='A'&&*p<='Z'?*p|0x60:*p;
tolower()
. 55,2 против 44,15 на моей машине.
int (*)(int)
подпись. Вот код, используемый для измерения производительности gist.github.com/370497
Вы имеете дело только со строками ASCII и не имеете проблем с локалью? Тогда да, это был бы хороший способ сделать это.
tolower()
оставляет аргумент без изменений, если он не находится в диапазоне 'A' ... 'Z'.
Если вам нужна поддержка Unicode в функции нижнего регистра, см. Этот вопрос: Light C Unicode Library
Если мы собираемся быть настолько небрежными в использовании tolower()
, сделайте следующее:
char blah[] = "blah blah Blah BLAH blAH\0"; int i=0; while(blah[i]|=' ', blah[++i]) {}
Но, ну, он вроде как взрывается, если вы кормите его некоторыми символами / цифрами, и в целом это зло. Тем не менее, хороший вопрос для собеседования.