在功能stricmp()和strnicmp()在C99去除?当我尝试针对C99编译时,我总是得到警告隐式声明函数stricmp()(以及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;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试针对C99(gcc -Wall -std=c99 main.c -o main)编译这段代码时,我收到了警告.但是当我没有编译它时-std=c99,不会抛出任何警告.但是,即使存在隐式声明的警告,我的代码仍然正常.
这是为什么?那是一个错误吗?如果不是一个错误,那么C99的变化究竟发生了什么?
代码用C99编译时,它符合C99标准,但没有stricmp().当代码在没有C99开关的情况下编译时,它符合实现的未知标准stricmp().(gcc没有-std=c99,可能编译为允许隐式声明的C89/90标准.)
正如@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;
}
Run Code Online (Sandbox Code Playgroud)
注意:编码并尝试进行A-Z匹配时a-z,字符串不敏感的比较例程往往可以很好地工作.但是当试图订购字符串时,事情很快就会失控."abc"与"_bc"可以在另一个之前或之后出现,这取决于同情是作为大写还是小写. '_'在ASCII中,存在于大写和小写字母之间.随着国际化和区域设置问题,情况变得更加复杂.我的代码示例使用往返转换来处理大写数字与小写数字char没有1对1映射的问题.IMO强大的不区分大小写的复杂性比较了UTF编码及其案例定义的使用.
stricmp和strincmp都是非标准函数。它们从来都不是 C 标准的一部分。