加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C99删除stricmp()和strnicmp()?

发布时间:2020-12-16 09:58:13 所属栏目:百科 来源:网络整理
导读:是否在C99中删除了stricmp()和strnicmp()函数? 当我尝试针对C99编译时,我总是得到警告隐式声明函数stricmp()(以及strnicmp()). 例如,下面的简单代码让我发出警告. #includestring.h#includestdio.hchar arr[100]="hello";char arr2[100]="hEllo";int main()
是否在C99中删除了stricmp()和strnicmp()函数?
当我尝试针对C99编译时,我总是得到警告隐式声明函数stricmp()(以及strnicmp()).
例如,下面的简单代码让我发出警告.

#include<string.h>
#include<stdio.h>

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;
}

注意:编码并尝试使A-Z与a-z匹配时,字符串不敏感的比较例程往往可以很好地工作.但是当试图订购字符串时,事情很快就会失控. “abc”与“_bc”可以在另一个之前或之后出现,这取决于同情是作为大写还是小写. ASCII中的’_’存在于大写和小写字母之间.随着国际化和区域设置问题,情况变得更加复杂.我的代码示例使用转换的往返来处理大写字符数与小写字母不具有1对1映射的问题. IMO强大的不区分大小写的复杂性比较了UTF编码及其案例定义的使用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读