【问题标题】:Write a macro function to change the case of a string?写一个宏函数来改变字符串的大小写?
【发布时间】:2020-10-10 09:43:46
【问题描述】:

// 我试过这段代码

 #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;
}

【问题讨论】:

  • 不要使用宏。改写一个函数。
  • 欢迎堆栈溢出。您可能想查看help section 以了解有关编写好问题的更多信息。特别是,我们需要描述您尝试运行代码时出了什么问题。
  • 没有宏函数这样的东西。有宏,也有函数。 99.999% 的时间你应该更喜欢一个函数。
  • 我根本不会尝试在 C 或 C++ 中为此使用宏。但是,在 C++ 中,如果您固执地坚持使用宏,并且假设您能够使用标准头文件&lt;cctype&gt;,那么#define case_change(str) std::transform(std::begin(str), std::end(str), [](int x) -&gt; int {return std::tolower(x) ? std::toupper(x) : (std::toupper(x) ? std::tolower(x) : x);}) 就会这样做。请注意,这不依赖于使用 ASCII 表示的字符。它也适用于编译器可以检测开始和结束的任何char 集合,而不仅仅是字符串。
  • @john -- 标准定义了“类函数宏”;它们通常被非正式地称为“宏功能”。

标签: c++ c string macros preprocessor


【解决方案1】:

您似乎对ififdef 感到困惑。 ifdef 用于测试之前是否定义了宏,并根据该定义启用功能。看到这个问题:The role of #ifdef and #ifndef

相反,您正在尝试基于运行时测试执行特定的代码段。为此,您需要 if

正如 cmets 中所述,当您应该编写函数时,通常认为编写宏是不好的做法。 Macro vs Function in C

【讨论】:

    【解决方案2】:
    #ifdef (str[i]>='a' && str[i]<='z')
    

    应该是

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

    #ifdef 没有意义,因为str[i] 必须在运行时进行评估,而宏预处理器仅在编译时工作。

    另外,#elifdef 不是合法令牌。出于与上述类似的原因,这应该是else if

    【讨论】:

      猜你喜欢
      • 2011-12-11
      • 2019-12-24
      • 2011-01-07
      • 1970-01-01
      • 2012-01-03
      • 2016-01-25
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多