Есть способ преобразовать верхний регистр в нижний БЕЗ выполнения, если тестирует , и это довольно просто. Использование функции / макроса isupper () для clocale.h должно позаботиться о проблемах, связанных с вашим местоположением, но если нет, вы всегда можете настроить UtoL [] на свое усмотрение.
Учитывая, что символы C на самом деле являются просто 8-битными целыми числами (игнорируя широкие наборы символов на данный момент), вы можете создать 256-байтовый массив, содержащий альтернативный набор символов, и в функции преобразования использовать символы в вашей строке как индексы в массив преобразования.
Вместо сопоставления 1-к-1 задайте для членов массива верхнего регистра значения int BYTE для символов нижнего регистра. islower () и isupper () могут оказаться полезными здесь.
Код выглядит так ...
#include <clocale>
static char UtoL[256];
// ----------------------------------------------------------------------------
void InitUtoLMap() {
for (int i = 0; i < sizeof(UtoL); i++) {
if (isupper(i)) {
UtoL[i] = (char)(i + 32);
} else {
UtoL[i] = i;
}
}
}
// ----------------------------------------------------------------------------
char *LowerStr(char *szMyStr) {
char *p = szMyStr;
// do conversion in-place so as not to require a destination buffer
while (*p) { // szMyStr must be null-terminated
*p = UtoL[*p];
p++;
}
return szMyStr;
}
// ----------------------------------------------------------------------------
int main() {
time_t start;
char *Lowered, Upper[128];
InitUtoLMap();
strcpy(Upper, "Every GOOD boy does FINE!");
Lowered = LowerStr(Upper);
return 0;
}
Этот подход, в то же время, позволит вам переназначить любые другие символы, которые вы хотите изменить.
Этот подход имеет одно огромное преимущество при работе на современных процессорах: нет необходимости делать предсказание ветвления, поскольку нет тестов, содержащих ветвление. Это сохраняет логику предсказания ветвления ЦП для других циклов и предотвращает задержки конвейера.
Некоторые здесь могут признать этот подход тем же, который использовался для преобразования EBCDIC в ASCII.