В этом примере предполагается, что строка находится в ASCII и использует английский алфавит.
Это код C99 C, вы должны использовать соответствующий флаг компилятора, чтобы установить его при компиляции. Я специально пытался не использовать какие-либо библиотеки в этом примере, стандартные или нет, потому что я предполагаю, что вы все еще изучаете основы программирования на Си.
#define UPPER_CASE_SWITCH 0x5f
void makeUpper(unsigned char *string, int length)
{
for(char c; length != 0 && (c=*string) != 0; --length)
*string++ = (((c >= 'a' && c <= 'z')) ? (c & UPPER_CASE_SWITCH) : c);
}
Используется тот факт, что ЕДИНСТВЕННАЯ разница между символом верхнего и нижнего регистра в таблице ASCII составляет один бит. В частности, 6-й бит (справа). Все, что нам нужно сделать, это создать «маску», которая содержит все 1, кроме 6-го бита (справа), а затем использовать двоичную инструкцию AND (&), чтобы применить эту маску к наш персонаж. И затем, конечно, поместите это в нашу строку.
Вот пример Python.
>>> bin(ord("a")) ## Gets the binary digit for the letter "a"
'0b1100001'
>>> bin(ord("A")) ## Gets the binary digit for the letter "A"
'0b1000001'
>>> hex(0b1011111) ## Gets the hexadecimal mask we are using in the C source
'0x5f'
На мой взгляд, это лучший способ сделать строку ASCII (или один символ ASCII) заглавной в c. Если, конечно, вам не нужно что-то, что будет возвращать новую строку, то есть вы хотите создать версию "старой" строки в верхнем регистре, но при этом будете иметь возможность где-то сохранить исходную версию. Это не должно быть слишком сложно, если вы понимаете мой первый пример. Вам просто нужно выделить новый массив для ввода строки в верхнем регистре и вернуть указатель на этот массив (без знака char *).