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

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

【问题讨论】:

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

标签: c string lowercase


【解决方案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,您不能假设每个字符有一个字节(就像这个解决方案一样)
    猜你喜欢
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2011-05-04
    • 2011-10-11
    • 1970-01-01
    相关资源
    最近更新 更多