Написать макрос-функцию для изменения регистра строки? - PullRequest
0 голосов
/ 20 июня 2020

// Я пробовал этот код

 #include<iostream>
 using namespace std;

// Функция для преобразования символов // строки в противоположный регистр

#define case_change(str)\
{\
    int ln = str.length();\

// Преобразование в соответствии со значениями ASCII

 #define for (int i=0; i<ln; i++)\
            {\
                #ifdef (str[i]>='a' && str[i]<='z'){\
                    str[i] = str[i] - 32;\
                #endif}
                //Convert lowercase to uppercase

                #elifdef (str[i]>='A' && str[i]<='Z')\{\
                    str[i] = str[i] + 32;\
                #endif}\
                //Convert uppercase to lowercase


            #endif}
    }

// Функция драйвера

int main()
{
    string str = "GeEkSfOrGeEkS";

    // Calling the Function
    case_change(str);

    cout << str;
    return 0;
}

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Похоже, вы перепутали if и ifdef. ifdef используется для проверки того, был ли ранее определен макрос, и включения функций на основе этого определения. См. Этот вопрос: Роль #ifdef и # ifndef

Вместо этого вы пытаетесь выполнить определенный фрагмент кода на основе теста времени выполнения. Для этого вам нужно вместо этого if.

Как упоминалось в комментариях, обычно считается плохой практикой писать макрос, когда вы должны писать функцию. Макрос против функции в C

0 голосов
/ 20 июня 2020
#ifdef (str[i]>='a' && str[i]<='z')

должно быть

if (str[i]>='a' && str[i]<='z')

#ifdef не имеет смысла, потому что str[i] должен оцениваться во время выполнения, а препроцессор макроса работает только во время компиляции.

Также #elifdef не является легальным токеном. По той же причине, что и выше, это должно быть else if.

...