【问题标题】:Are strupr() and strlwr() in string.h part of the ANSI standard?string.h 中的 strupr() 和 strlwr() 是 ANSI 标准的一部分吗?
【发布时间】:2014-12-07 07:10:49
【问题描述】:

我在互联网上寻找这个,在每个地方都有 string.h 的功能,没有提到这两个。

是因为什么?它们不在每个编译器中?

【问题讨论】:

标签: c string.h


【解决方案1】:

这些函数不是 C 标准函数。因此,是否支持它们是由实现定义的。

【讨论】:

    【解决方案2】:

    它们是来自 Microsoft 的 C 库的非标准函数。此后,MS 弃用了它们,转而支持重命名的函数 _strlwr()_strupr()

    请注意,MS 文档声称它们是 POSIX 函数,但据我所知,它们从未如此。

    如果您需要在非 MS 工具链上使用它们,它们很容易实现。

    char* strlwr(char* s)
    {
        char* tmp = s;
    
        for (;*tmp;++tmp) {
            *tmp = tolower((unsigned char) *tmp);
        }
    
        return s;
    }
    

    【讨论】:

    • gcc 也支持它们,即使您尝试使用 -std=c11 之类的东西强制遵守标准。
    • 关于它们是 POSIX 函数 - 有一个可搜索的 POSIX.1-2017 在线版本托管在 pubs.opengroup.org/onlinepubs/9699919799 - 而且它们绝对没有在其中提及。
    • 另外,您可能想在该代码 sn-p 中添加 #include <ctype.h>,因为 tolower 需要它,而 strlwr 需要 <string.h>
    【解决方案3】:

    这些函数不是标准的,实际上它们的签名已损坏/无法使用。一般来说,您不能就地对字符串进行大小写映射,因为在大小写映射下长度可能会发生变化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-11
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 2013-04-07
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多