为什么有多个C函数用于不区分大小写的比较

为什么有多个C函数用于不区分大小写的比较,c,string,posix,msvcrt,crt,C,String,Posix,Msvcrt,Crt,为了在不考虑大小写的情况下比较任何字符串,有各种C库函数,如stracecmp()、stricmp()和stricmpi()。它们之间的区别是什么?无论是stricmp()还是strcmp()都不是由(或)描述的 以不区分大小写的方式比较字符串的标准方法是在使用strcmp()之前将两者转换为小写(或大写) POSIX函数是。有多种方法来做很多事情,主要是因为标准过程落后于实现。人们看到了对函数的需要(在本例中,是不区分大小写的字符串比较),一些编译器编写器/库编写器实现了一个名为strcmpi

为了在不考虑大小写的情况下比较任何字符串,有各种C库函数,如
stracecmp()
stricmp()
stricmpi()
。它们之间的区别是什么?

无论是
stricmp()
还是
strcmp()
都不是由(或)描述的

以不区分大小写的方式比较字符串的标准方法是在使用
strcmp()
之前将两者转换为小写(或大写)


POSIX函数是。

有多种方法来做很多事情,主要是因为标准过程落后于实现。人们看到了对函数的需要(在本例中,是不区分大小写的字符串比较),一些编译器编写器/库编写器实现了一个名为strcmpi的函数,而另一组实现了strcmp,而另一组则认为不必实现它,当另一组实现STRCCMP时,另一组实现strcmpnocase等。几年后,不同组的代表在殊死搏斗中相遇,获胜者的实现成为语言的一部分。同时,其他实现继续使用其他命名方法,语言变得更强/碎片/增益膨胀(取决于您的观点)。

两者都是非标准扩展,即不是“C语言”(由ISO/IEC 9899指定)的一部分

strcmpi()
在MSDN中被提到,错误地称之为“POSIX函数”,并将
\u stdicmp
称为替代品(这只是稍微好一点)

stricmp()
在Wikipedia上被提到过,但不是标准的

您必须了解,任何库实现都可以自由地提供附加功能。像
open()
read()
OpenFile()
AllocMem()
等等——这些都不是“C语言”,只是用C实现的,在一个或多个平台上工作,但在其他平台上不一定可用

int strcmpi(const char *s1, const char *s2);
int stricmp(const char *s1, const char *s2);
‏strcmp(作为调用stricmp的宏实现)执行s1到s2的无符号比较,不区分大小写。 strcmpi执行s1到s2的无符号比较,不区分大小写

要使用strcmpi,必须包含
STRING.H
此宏是为
与其他C编译器的兼容性。

另请参见:我现在自己做了这件事(如果接受编辑),只是为了完整性:是的,
read
open
不是C标准的一部分,但它们是POSIX超集的一部分。称它们为非标准函数是正确的,但使用它们并不像其他一些非标准函数那样“不安全”或不可移植(如
clone
sys\u clone
)@EliasVanOotegem DOS让函数read()和open()。它们可能也存在于Unix中。可能有不同的规格。由于这些操作系统肯定比POSIX更早,所以在POSIX成为ISO标准之前,这些功能就已经存在了。POSIX“保留”了许多已经存在于多个版本中的东西。我绝对不会仅仅因为函数是POSIX的一部分就认为它们是可移植的或安全的。@EliasVanOotegem:一个立场问题。我对POSIX、它承诺的“可移植性”以及“POSIX合规性”对OS API设计器的限制有几个问题。但对于这个问题,或者一般的问答来说,这是非常困难的。我支持我的帖子的措辞。@lundin:我不是要宣布POSIX保证绝对的可移植性(它不是),我只是想在“I”和“t”之间加上点,说这些功能应该在POSIX兼容上可用systems@EliasVanOotegem:我当然希望它们在POSIX兼容系统上可用,否则系统将不兼容,是吗?;-)“unsigned”是什么意思?这是一个有趣的背景,但是@pmg的答案,虽然票数较少,但信息量要大得多。c2011也没有区分大小写的比较函数