string.h 中的 strupr() 和 strlwr() 是 ANSI 标准的一部分吗?

Are strupr() and strlwr() in string.h part of the ANSI standard?

提问人:exsnake 提问时间:10/13/2014 最后编辑:ks1322exsnake 更新时间:5/6/2021 访问量:21093

问:

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

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

c 字符串.h

评论

0赞 alk 10/13/2014
相关(如果不是重复):stackoverflow.com/q/23618316/694576

答:

5赞 Vlad from Moscow 10/13/2014 #1

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

16赞 Michael Burr 10/13/2014 #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;
}

评论

0赞 AJM 5/6/2021
它们也受到 gcc 的支持,即使您尝试强制遵守类似 .-std=c11
1赞 AJM 5/6/2021
关于它们是 POSIX 函数 - pubs.opengroup.org/onlinepubs/9699919799 上托管了一个可搜索的 POSIX.1-2017 在线版本 - 其中绝对没有提到它们。
0赞 AJM 5/6/2021
此外,您可能希望添加该代码片段,因为需要它并且需要它。#include <ctype.h>tolowerstrlwr<string.h>
0赞 chikega 9/24/2022
_strlwr并将在 Visual Studio 2022 中非法编译器警告 C4996(你的代码使用标记为已弃用的函数、类成员、变量或 typedef),建议改用 。_strupr_strlwr_s_strupr_s
0赞 Weather Vane 11/13/2023
链接的MS文档并没有声称这些是Posix函数,而是“特定于Microsoft的”。该页面根本没有提到 Posix,并且该页面在重命名函数时提到了它,并链接到带有以下备注的页面:Microsoft 重命名了 CRT 中的一些 POSIX 和 Microsoft 特定的库函数,以符合...重命名涉及 MS 和 Posix 函数,它们不属于 C sttandard。_strlwrstrlwr
2赞 R.. GitHub STOP HELPING ICE 10/13/2014 #3

这些函数不是标准的,实际上它们的签名已损坏/不可用。通常不能就地对字符串进行大小写映射,因为在大小写映射下长度可能会更改。