是否在C99中删除了stricmp()
和strnicmp()
函数? 当我尝试针对C99编译时,我总是得到警告隐式声明函数stricmp() (以及strnicmp() )。 例如,下面的简单代码让我发出警告。
#include #include char arr[100]="hello"; char arr2[100]="hEllo"; int main() { int n=-1; printf("%dn",n); n=strnicmp(arr,arr2,3); // the same when use the function stricmp(); printf("%dn",n); getchar(); return 0; }
当我尝试针对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 != ' '); return ca - cb; }
注意:编码并尝试使AZ
匹配az
,字符串不敏感的比较例程往往可以很好地工作。 但是当试图订购字符串时,事情很快就会失控。 “abc”与“_bc”可以在另一个之前或之后,取决于同情是作为大写还是小写。 ASCII中的'_'
存在于大写和小写字母之间。 随着国际化和区域设置问题,情况变得更加复杂。 我的代码示例使用转换的往返来处理大写char
数与小写字母不具有1对1映射的问题。 IMO强大的不区分大小写的复杂性比较了UTF编码及其案例定义的使用。
stricmp
和strincmp
都是非标准函数。 它们从未成为C标准的一部分。
以上就是c/c++开发分享C99删除stricmp()和strnicmp()?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/518951.html