如何在 C 中小写字符串?

Posted

技术标签:

【中文标题】如何在 C 中小写字符串?【英文标题】:How do I lowercase a string in C? 【发布时间】:2011-02-09 08:16:54 【问题描述】:

如何在 C 中将混合大小写字符串转换为小写字符串?

【问题讨论】:

你只是处理带有字母 a-z 的 ASCII 吗? ascii.我将如何考虑到这一点?下面的示例仍然有效吗?如果我的 char 是 '#' 并调用 tolower() 会发生什么? 那行得通。我更想知道你的字符串是否包含 é 或 Ü 之类的东西。 为什么不直接使用“strlwr”? strlwr((char*)str); 它只是遍历字符串并自行转换。 @Larry 这是非标准的。 【参考方案1】:

它在标准库中,这是我能看到的实现此类功能的最直接的方法。所以是的,只需遍历字符串并将每个字符转换为小写即可。

像这样微不足道的事情:

#include <ctype.h>

for(int i = 0; str[i]; i++)
  str[i] = tolower(str[i]);

或者,如果您更喜欢一种衬里,那么您可以使用 J.F. Sebastian 的这款:

for ( ; *p; ++p) *p = tolower(*p);

【讨论】:

for ( ; *p; ++p) *p = tolower(*p); 似乎更惯用。 @J.F.你去吧。取决于他们是否希望代码看起来很吓人或漂亮:)(非常可读的一行,但看起来确实很吓人) 如果 str 是 char *,这会给我一个段错误,但如果 str 是 char 数组则不会。对此有什么解释吗? 我相信单行会导致您丢失指向字符串的指针。 我相信一个班轮会产生不可估量的后果。【参考方案2】:

如果限制为 ASCII,则转换为小写等同于上升位 0x60:

for(char *p = pstr; *p; ++p)
    *p = *p > 0x40 && *p < 0x5b ? *p | 0x60 : *p;

【讨论】:

为了让它更易读,你可以这样做for(char *p = pstr;*p;++p) *p=*p&gt;='A'&amp;&amp;*p&lt;='Z'?*p|0x60:*p; 这个版本其实比glibc的tolower()慢。 55.2 vs. 44.15 在我的机器上。 我无法想象:tolower() 处理字符;仅当它是宏时 @oraz: tolower() 有int (*)(int) 签名。这是用于性能测量的代码gist.github.com/370497 @JF:我明白了,他们使用了表格,但我可以优化:for (; *p; ++p) if(*p > 'Z') continue; else if (*p 【参考方案3】:

循环指针以获得更好的性能:

#include <ctype.h>

char* toLower(char* s) 
  for(char *p=s; *p; p++) *p=tolower(*p);
  return s;

char* toUpper(char* s) 
  for(char *p=s; *p; p++) *p=toupper(*p);
  return s;

【讨论】:

好吧,如果你是单线的,那么s是你函数中的一个局部变量,你可以直接使用它而不是声明p。`【参考方案4】:

如果您在小写函数中需要 Unicode 支持,请参阅以下问题: Light C Unicode Library

【讨论】:

【参考方案5】:

如果我们要像使用 tolower() 一样草率,请这样做:

char blah[] = "blah blah Blah BLAH blAH\0";
int i = 0;
while( blah[i] |=' ', blah[++i] ) 

但是,好吧,如果你给它一些符号/数字,它就会爆炸,而且总的来说它是邪恶的。不过很好的面试问题。

【讨论】:

是的,这将折叠/旋转/破坏各种符号(在 ASCII 中,任何第 5 位清除的符号、控制字符或数字将成为与第 5 位设置相同的字符代码等)所以真的,说真的,不要使用它。 这篇文章在meta讨论。【参考方案6】:

您只是在处理 ASCII 字符串,而没有语言环境问题吗?那么是的,这将是一个很好的方法。

【讨论】:

如果在非 ascii a-z 字符上调用 tolower() 会发生什么?喜欢 '!'要么 '#'。我在“#”上对其进行了测试,它似乎工作正常。对于所有不是字母 a-z 的 ascii 字符,这通常是正确的吗? @hatorade: tolower() 如果不在 'A'..'Z' 范围内,则保持参数不变。 !和 # 都是 ascii 字符。马克指的是其他编码,如 UTF8,您不能假设每个字符有一个字节(就像这个解决方案一样)

以上是关于如何在 C 中小写字符串?的主要内容,如果未能解决你的问题,请参考以下文章

Python接收输入一个字符串,统计其中小写字母的个数

python统计并输出字符串中小写元音字母的个数?

SqlServer 获取字符串中小写字母的sql语句

汇编:实验11:字符串中小写转大写

汇编:实验11:字符串中小写转大写

急救:编写一个简单的Shell程序,实现将指定的文件内容中小写字母转换成大写字母显示出来。