首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

写一个宏函数来改变字符串的大小写?

在C语言中,可以使用宏函数来实现字符串大小写的转换。下面是一个简单的例子,展示了如何定义宏函数来改变字符串的大小写:

代码语言:txt
复制
#include <stdio.h>
#include <ctype.h> // 包含字符处理函数

// 宏定义,用于将字符转换为大写
#define TO_UPPER(c) ((c) >= 'a' && (c) <= 'z' ? (c) - 'a' + 'A' : (c))

// 宏定义,用于将字符转换为小写
#define TO_LOWER(c) ((c) >= 'A' && (c) <= 'Z' ? (c) - 'A' + 'a' : (c))

// 函数用于改变字符串的大小写
void changeCase(char *str, int toUpper) {
    for (int i = 0; str[i]; i++) {
        if (toUpper) {
            str[i] = TO_UPPER(str[i]); // 转换为大写
        } else {
            str[i] = TO_LOWER(str[i]); // 转换为小写
        }
    }
}

int main() {
    char str[] = "Hello, World!";

    printf("Original string: %s\n", str);
    changeCase(str, 1); // 将字符串转换为大写
    printf("Uppercase string: %s\n", str);
    changeCase(str, 0); // 将字符串转换为小写
    printf("Lowercase string: %s\n", str);

    return 0;
}

在这个例子中,TO_UPPERTO_LOWER 是两个宏函数,它们分别用于将字符转换为大写和小写。changeCase 函数接受一个字符串和一个布尔值 toUpper,如果 toUpper 为真,则将字符串转换为大写,否则转换为小写。

宏函数的优势在于它们在预处理阶段展开,可以提高程序的执行效率。但是,宏函数也有一些缺点,比如可能会导致代码膨胀,因为每次使用宏都会插入相应的代码片段。此外,宏函数没有类型检查,可能会导致一些难以发现的错误。

应用场景:

  • 当需要在编译时确定字符串的大小写转换,并且对性能有较高要求时,可以使用宏函数。
  • 宏函数适用于简单的字符转换,但对于复杂的字符串操作,使用函数可能更加清晰和安全。

遇到的问题及解决方法:

  • 宏函数可能会导致预期之外的副作用,因为它们只是简单的文本替换。例如,如果传递给宏的是一个表达式而不是单个变量,那么这个表达式可能会被多次求值,从而导致错误。解决这个问题的方法是确保传递给宏的是单个变量,或者在宏内部使用括号来避免错误的运算顺序。

在实际开发中,如果不需要在编译时进行大小写转换,或者需要处理复杂的字符串操作,建议使用函数而不是宏函数,因为函数提供了类型安全和更好的代码可读性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 用python写一个简易的字符串替换工具

    这篇文章的内容很简单,记录的内容也没有太多知识点,很简单(水文); 需求很简单,就是可以上传一个 markdown 文件,设定一个待替换字符串和一个替换字符串,能自动替换后保存下来; 需求场景就是图片链接的域名发生变化之后能够快速的切换地址...方法的语法如下: str.replace(old, new[, count]) 返回值是一个新的字符串,其中所有的 old 子串都被 new 替换了,而原始字符串 str 保持不变(因为字符串是不可变的...写一个gui程序 要支持选择文件,输出文件的话,还是有个界面可以选择比较方便,所以写个 gui 程序应该会不错; 这也很简单,具体的实现方法看注释: # 导入Tkinter库,并为其设置别名tk,用于创建...,显示窗口 root.mainloop() 实现效果: 使用Fastapi写一个在线的程序 纯属是自己想折腾,fastapi 主要代码如下: from fastapi import FastAPI, UploadFile...那么这里也再推荐一个在线的工具:https://www.lddgo.net/string/text-replace

    6110

    Windows内核中的内存管理

    内存管理的要点 内核内存是在虚拟地址空间的高2GB位置,且由所有进程所共享,进程进行切换时改变的只是进程的用户分区的内存 驱动程序就像一个特殊的DLL,这个DLL被加载到内核的地址空间中,DriverEntry...上面这些函数主要分为带有标记和不带标记的两种,其中有Quota的是按配额分配,带有标记的函数可以通过这个标记来判断这块内存最后有没有被分配,标记是一个字符串,但是这个字符串是用单引号引起来的。...一般给4个字符,由于IntelCPU采用的是高位优先的存储方式,所以为了阅读方便,一般将这个字符串倒着写 这些函数分配的内存一般使用下面的函数来释放 VOID ExFreePool(...: //头插法,采用头插法只改变链表数据的顺序,链表头仍然是链表中的第一个元素 VOID InsertHeadList( IN PLIST_ENTRY ListHead, //链表头指针...函Tag:数申请内存时填写的标志相同 Depth:系统保留,必须填0 创建容器之后,可以用下面两个函数来分配内存 PVOID ExAllocateFromNPagedLookasideList

    1.4K20

    写一个宏定义,不用大于号小于号和if,判断正整数a,b的大小

    今天分享一个有意思的题目,考察了两个C语言容易被忽视的知识点。 题目: 写一个宏定义,不用大于号>、小于号的大小。...b:a 解答: 0x80000000 的二进制是:1000 0000 0000 0000 0000 0000 0000 0000(第一位是符号位,所以此数是负数) 如果a-b是正数:根据二进制数的表示..., 分为符号位跟数值位,0正1负,所以a-b的最高位是0,那么与上1000 0000 0000 0000 0000 0000 0000 0000之后,三元运算符判断条件结果是0,输出a 如果a-b是负数...那最高位是1,与上1000 0000 0000 0000 0000 0000 0000 0000之后,三元运算符判断条件结果是1,输出b 考察知识点: 1、与或非 2、三元运算符 拔高题(大厂笔试题): 写一个宏定义...,判断正整数a,b的大小。 大家可以在评论区留下自己的答案,最优秀的答案有红包奖励。

    97220

    python 如何改变字符串中某一个值_python替换字符串中的某个字符

    一、            Split()  作用:将字符串分割成为列表,不改变字符串原始值  这里以x为分割符,将a分成了含有三个元素的列表并输出。但不...  ...格式化字符串  字符串格式化使用字符串格式化操作符即百分号%来实现。在%左侧放置一个字符串(格式化字符串),而右侧则放置希望格式化的值(可以是元组或字典等)。  注意:  如果格式化...  ...Python中内置有对字符串进行格式化的操作%。  模板  格式化字符串时,Python使用一个字符串作为模板。模板中有格式符,这些格式符为真实值预留位置,并说明真实数值应该呈现的格式。... 杨海宏 何子健 杨 征,更多章节内容可以访问云栖社区“华章计算机”公众号查看。  ...的字符串类型是不可以改变的,你无法将原字符串进行修改,但是可以将字符串的一部分复制到新的字符串中,来达到相同的修改效果。

    5.7K00

    toLocaleLowerCase 函数

    #startsWith()函數的使用方法#### string.startsWith(searchvalue, start) searchvalue:必需,要查找的字符串。...start:可选,查找的开始位置,默认为 0。 方法用于检测字符串是否以指定的子字符串开始。 如果是以指定的子字符串开头返回 true,否则 false。...startsWith() 方法对 大小写敏感 。 toLocaleLowerCase() 方法根据本地主机的语言环境把字符串转换为小写。 本地是根据浏览器的语言设置来判断的。...注意: toLocaleLowerCase() 方法没有改变原始字符串。 提示: 使用 toLocaleUpperCase()(https://links.jianshu.com/go?...注意: toLocaleUpperCase() 方法没有改变原始字符串。 提示: 使用 toLocaleLowerCase()(https://links.jianshu.com/go?

    1.3K44

    RTOS函数命名规则

    驼峰命名法,正如它的名称所表示的那样,指的是混合使用大小写字母来构成标识符的名字。其中第一个单词首字母小写,余下的单词首字母大写。...例如: printEmployeePaychecks(); 函数名中每一个逻辑断点都有一个大写字母来标记。 帕斯卡(Pascal)命名法:与驼峰命名法类似。...只不过驼峰命名法是第一个单词首字母小写,而帕斯卡命名法则是第一个单词首字母大写。因此这种命名法也有人称之为“大驼峰命名法”。...prv :static函数 v: void函数 函数名 函数名包含了函数返回值的类型、函数所在的文件名和函数的功能,如果是私有的函 数则会加一个 prv(private)的前缀。...; 宏定义 FreeRTOS的大多数宏都是用大写字母写的,并以小写字母作为前缀来表示 定义了宏,如下所示; _s,_t后缀 _s:struct _t:type

    1.9K20

    校长讲堂第十讲

    首先,我们希望可以通过改变一个数字并重新编译程序来改变一个特殊量(如表的大小)的所有实例。 其次,我们可能希望定义一些东西,它们看起来象函数但没有函数调用所需的运行开销。...,这会正常地工作,但当 max()是一个宏的时候会失败。...而第二个参数会被求值两次(在宏体中,x 出现了两次,但由于它的两次出现分别在一个:的两边,因此在putc()的一个实例中它们之中有且仅有一个被求值)。...如果我们假设所有的小写字母和所有的大写字母都是相邻的(大小写之间可能有所差距),我们可以得到这样的函数: toupper(c) { if(c >= 'a' && c <= 'z') c += 'A'...然而,当你试着写 toupper(*p++)时,会出现奇怪的结果。 另一个需要注意的地方是使用宏可能会产生巨大的表达式。

    34361

    宏(预编译)详解

    2.当预处理器搜索#define定义的符号的时候,字符串常量的内容并不被搜索。 3.2.4 #和## 1)#的作用: 思考这样一个问题:如何把参数插入到字符串当中呢?...main() { int a = 10; PRINT(a); int b = 20; PRINT(b); return 0; } 把一个字符串从要替换的字符串的中点分成两个字符串...实质上这个宏其实是PRINT(n) printf("The value ""n"" is %d\n",n),相当于在'#'后面部分的字符串改变后又被重新拼接起来形成一个新的完整的字符串。...函数参数只在函数调用的时候求 值一次,它的结果值传递给函 数。...3.4文件包含 我们不论写C语言还是写C++语言,我们都会用到头文件,像等,其实,#include指令可以使另外一个文件被编译。

    25910

    《最新出炉》系列入门篇-Python+Playwright自动化测试-52- 字符串操作 - 下篇

    flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见上方可选标志表格 匹配成功re.match方法返回一个匹配的对象,否则返回None。...实例及输出: 第一个匹配成功,第二个则失败 3.4.2re.search() re.search 扫描整个字符串并返回第一个成功的匹配。...flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见上方可选标志表格 匹配成功re.search方法返回一个匹配的对象,否则返回None。...用法1 直接使用的语法格式为: re.findall(pattern, string, flags) 参数: pattern 正则表达式 string 待匹配的字符串 flags re的一些flag,可不写...flags 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

    19510

    使用VBA加载宏小心 Workbook.FullName 属性

    Workbook.FullName在VBA中是一个非常常用的属性,返回的是工作簿的全路径,首先查看一下帮助文件: 返回对象的名称(以字符串表示),包括其磁盘路径。String 型,只读。...再仔细一看,会发现我故意将一些字母大小写替换了,文件能正确打开,但FullName返回的字符串和原始字符串有差异了。...当然,实际写代码过程中,一般不会这样故意去修改文件的路径。...我个人有这样一个使用习惯,由于需要使用的VBA功能较多,我将一些功能分类编写了不同的宏文件,这些文件存放在同一个文件夹里,只设置加载一个加载宏。...如下图所示,修改了路径中的字母大小写,加载宏myVBA.xlam没有过滤掉: ?

    1.5K40
    领券