如何在 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>='A'&&*p<='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 中小写字符串?的主要内容,如果未能解决你的问题,请参考以下文章