是否删除了stricmp()和strnicmp()在C99中的函数?在尝试针对编译函数(以及strnicmp() )时,总是会收到警告它的隐式声明。例如,下面的简单代码向我发出警告。
#include<string.h>
#include<stdio.h>
char arr[100]="hello";
char arr2[100]="hEllo";
int main()
{
int n=-1;
printf("%d\n",n);
n=strnicmp(arr,arr2,3); // the same when use the function stricmp();
printf("%d\n",n);
getchar();
return 0;
}当我试图针对C99(gcc -Wall -std=c99 main.c -o main)编译这段代码时,我会收到警告。但是,当我在没有-std=c99的情况下编译它时,不会抛出任何警告。然而,即使有隐式声明的警告,我的代码仍然工作正常。
为什么会这样呢?那是窃听器吗?如果不是一个bug,那么C99的变化究竟是什么导致了这个警告的发生?
发布于 2015-06-09 13:50:50
当代码使用C99编译时,它符合没有stricmp()的C99标准。在没有C99开关的情况下编译代码时,它符合实现stricmp()的未知标准。(给定没有gcc的-std=c99,可能会编译到C89/90标准wihich,允许隐式声明)。
正如@Joachim Pileborg所评论的,不敏感的比较不是C标准的一部分。
对于C99,隐式函数需要诊断(在本例中是警告)。如果没有C99,则该函数的隐式使用不会产生警告。函数存在于这个编译器的库中--这只是一个在使用之前声明的函数的问题。
很容易做出你自己的:
int wal_stricmp(const char *a, const char *b) {
int ca, cb;
do {
ca = (unsigned char) *a++;
cb = (unsigned char) *b++;
ca = tolower(toupper(ca));
cb = tolower(toupper(cb));
} while (ca == cb && ca != '\0');
return ca - cb;
}注意:在编写代码并使A-Z与a-z匹配时,字符串不敏感的比较例程倾向于一致地工作。但是,当试图订购字符串时,事情很快就失控了。"abc“和"_bc”可以出现在对方之前或之后,这取决于同情是作为大写还是小写。'_',在ASCII中,存在于大小写字母之间。随着国际化和本地化问题的出现,情况变得更加复杂。我的代码示例使用双向转换来处理大写char的数量没有1到1与小写映射的问题。IMO强大的大小写不敏感的复杂性决定了UTF编码的使用和它的大小写定义。
编辑2020
为了应对那些被遗弃的非2的补码平台以及2的补码平台,代码修正是必要的。以前的代码会将+0和-0折叠成unsigned 0。只有+0应该转换为0。正确地将数据读取为unsigned char而不是signed char并进行转换。
注:目前非2级补语中的正确句式大多是学术性的.
// ca = (unsigned char) *a++;
ca = *((unsigned char *) a++);
// also cb发布于 2015-06-09 13:45:27
stricmp和strincmp都是非标准函数。它们从来都不是C标准的一部分。
https://stackoverflow.com/questions/30733786
复制相似问题