Как я могу преобразовать строку смешанного регистра в строку нижнего регистра в C?
Как сделать строчную строку в C?
Ответы (6)
Она есть в стандартной библиотеке, и это самый простой способ реализации такой функции, который я вижу. Так что да, просто прокрутите строку и преобразуйте каждый символ в нижний регистр.
Что-то тривиальное вроде этого:
#include <ctype.h>
for(int i = 0; str[i]; i++){
str[i] = tolower(str[i]);
}
или если вы предпочитаете один лайнер, то вы можете использовать этот от J.F. Sebastian:
for ( ; *p; ++p) *p = tolower(*p);
for ( ; *p; ++p) *p = tolower(*p);
кажется более идиоматичным.
- person jfs; 18.04.2010
char *
, но не если str является массивом символов. Есть какое-нибудь объяснение этому?
- person Electric Coffee; 23.11.2016
char *
, вы действительно использовали строковую константу, которая помещается в недоступную для записи секцию памяти. Поэтому, если вы попытаетесь изменить это значение, это даст вам segfault. Если, с другой стороны, вы скопируете эту постоянную строку в char *copy = strdup (const_string)
, то copy
можно будет изменить, поскольку она размещена в куче, доступной для записи. Так что в целом это не имеет ничего общего с использованием указателя (char *
), а с использованием строк-констант, как в коде: char *const_str = "my const string"
.
- person Jan; 05.09.2017
error: lvalue required as increment operand
- person nmz787; 26.04.2018
while (*p = tolower(*p)) ++p;
или while (*p = tolower(*p++))
для запутывания (последнее работает только с C++ 17) ;-)
- person L. F.; 18.05.2019
преобразование в нижний регистр эквивалентно повышению бита 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;
- person Grant Peters; 18.04.2010
tolower()
glibc. 55,2 против 44,15 на моей машине.
- person jfs; 18.04.2010
int (*)(int)
. Вот код, используемый для измерения производительности gist.github.com/370497.
- person jfs; 18.04.2010
if (*p > 'Z')
лучше работает с вводом, который я использовал, но если много заглавных букв, это занимает столько же времени, сколько и предыдущая версия.
- person jfs; 19.04.2010
Вы имеете дело только со строками ASCII и не имеете проблем с локалью? Тогда да, это был бы хороший способ сделать это.
tolower()
оставляет аргумент без изменений, если он не находится в диапазоне «A»... «Z».
- person jfs; 18.04.2010
Если вам нужна поддержка Unicode в функции нижнего регистра, см. этот вопрос: Light C Unicode Library
Если мы собираемся использовать tolower()
небрежно, сделайте следующее:
char blah[] = "blah blah Blah BLAH blAH\0"; int i=0; while(blah[i]|=' ', blah[++i]) {}
Но, ну, он как бы взрывается, если накормить его какими-то символами/цифрами, и вообще это зло. Хороший вопрос для интервью, однако.
Зацикливание указателя для повышения производительности:
#include <ctype.h>
char* toLower(char* s) {
for(char *p=s; *p; p++) *p=tolower(*p);
return s;
}
char* toUpper(char* s) {
for(char *p=s; *p; p++) *p=toupper(*p);
return s;
}
strlwr((char*)str);
Он просто просматривает строку и преобразует ее сам. - person Larry   schedule 02.03.2018