Как упражнение для обучения, мои три функции - ToggleCase, LowerCase и UpperCase - каждый ожидает указатель на строку ASCII char, завершенную нулевым символом; они работают так, как ожидалось. Существуют ли более эффективные или более быстрые методы решения этой задачи? Я нарушаю любые невысказанные правила хорошего кодирования C? Я использовал макросы, потому что, по-моему, код выглядит лучше и эффективнее вызовов функций. Является ли это типичным или излишним?
Пожалуйста, не стесняйтесь выбирать и критиковать код (но делайте это хорошо).
case_conversion.h
#define CASE_FLAG 32
#define a_z(c) (c >= 'a' && c <= 'z')
#define A_Z(c) (c >= 'A' && c <= 'Z')
void ToggleCase(char* c);
void LowerCase(char* c);
void UpperCase(char* c);
case_conversion.c
#include "case_conversion.h"
void ToggleCase(char* c)
{
while (*c)
{
*c ^= a_z(*c) || A_Z(*c) ? CASE_FLAG : 0;
c++;
}
}
void LowerCase(char* c)
{
while (*c)
{
*c ^= A_Z(*c) ? CASE_FLAG : 0;
c++;
}
}
void UpperCase(char* c)
{
while (*c)
{
*c ^= a_z(*c) ? CASE_FLAG : 0;
c++;
}
}