【问题标题】:Is there a faster way to lowercase a string in C?有没有更快的方法来小写 C 中的字符串?
【发布时间】:2020-11-10 06:46:51
【问题描述】:

小写字符串最直观的方法是循环遍历它并降低每个字符:

do {
    *Str = tolower(*Str);
} while (*++Str);

但是,就像memcpy() 比在 for 循环中复制每个字节更快一样,有没有更快的方法在 C 中将字符串小写?就像我可以使用按位魔法或其他东西一次降低多个字符吗?

【问题讨论】:

  • 您可以尝试对其进行矢量化或并行化,但最好提供更多信息来说明为什么循环对于您的用例而言太慢。例如,您的输入有多大?
  • 您有性能问题吗?除非它是您程序中确认的热点,否则我会坚持这样做。
  • 没有更好的标准 C 方法。可能会有特定于实现的扩展。
  • 你知道第一个字符不会小写吗?它只适用于单字节字符集?
  • @Barmar 这不是重复的。我要求的是更快的方式,而不是a的方式。

标签: c string


【解决方案1】:

便携式查找表可能是最快的。对于特定的编码(例如 ASCII)一些字符算法。

const char table[256] = {
                         ['a'] = 'a', ['A'] = 'a',
                         ['b'] = 'b', ['B'] = 'b',
                         ['c'] = 'c', ['C'] = 'c',
                         ['d'] = 'd', ['D'] = 'd',
                         ['e'] = 'e', ['E'] = 'e',
                         ['f'] = 'f', ['f'] = 'f',
                         ['g'] = 'g', ['g'] = 'g',
                         ['h'] = 'h', ['H'] = 'h',
                         ['i'] = 'i', ['I'] = 'i',
                         ['j'] = 'j', ['J'] = 'j',
                         /* etc etc */
};


char *strl_p(char *str)
{
    char c;
    char *saved = str;
    unsigned char *ustr = str;

    while(*ustr)
    {
        c = table[*ustr];
        if(c) *ustr = c;
        ustr++;
    }
    return saved;
}

char *strl_ascii(char *str)
{
    char c;
    char *saved = str;

    while(*str)
    {
        c = *str;
        if(c >= 'A' && c <= 'Z') *str = c - ('A' - 'a');
        str++;
    }
    return saved;
}

【讨论】:

  • 是的,这么小的桌子恐怕是无敌的了。除非人们可以盲目地或使用 0x20 进行任何已知的拉伸。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2010-10-31
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多