首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C99删除()和strnicmp()?

C99删除()和strnicmp()?
EN

Stack Overflow用户
提问于 2015-06-09 13:43:07
回答 2查看 12.3K关注 0票数 9

是否删除了stricmp()strnicmp()在C99中的函数?在尝试针对编译函数(以及strnicmp() )时,总是会收到警告它的隐式声明。例如,下面的简单代码向我发出警告。

代码语言:javascript
复制
#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的变化究竟是什么导致了这个警告的发生?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-09 13:50:50

当代码使用C99编译时,它符合没有stricmp()的C99标准。在没有C99开关的情况下编译代码时,它符合实现stricmp()的未知标准。(给定没有gcc-std=c99,可能会编译到C89/90标准wihich,允许隐式声明)。

正如@Joachim Pileborg所评论的,不敏感的比较不是C标准的一部分。

对于C99,隐式函数需要诊断(在本例中是警告)。如果没有C99,则该函数的隐式使用不会产生警告。函数存在于这个编译器的库中--这只是一个在使用之前声明的函数的问题。

很容易做出你自己的:

代码语言:javascript
复制
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-Za-z匹配时,字符串不敏感的比较例程倾向于一致地工作。但是,当试图订购字符串时,事情很快就失控了。"abc“和"_bc”可以出现在对方之前或之后,这取决于同情是作为大写还是小写。'_',在ASCII中,存在于大小写字母之间。随着国际化和本地化问题的出现,情况变得更加复杂。我的代码示例使用双向转换来处理大写char的数量没有1到1与小写映射的问题。IMO强大的大小写不敏感的复杂性决定了UTF编码的使用和它的大小写定义。

编辑2020

为了应对那些被遗弃的非2的补码平台以及2的补码平台,代码修正是必要的。以前的代码会将+0和-0折叠成unsigned 0。只有+0应该转换为0。正确地将数据读取为unsigned char而不是signed char并进行转换。

注:目前非2级补语中的正确句式大多是学术性的.

代码语言:javascript
复制
// ca = (unsigned char) *a++;
ca = *((unsigned char *) a++);
// also cb
票数 13
EN

Stack Overflow用户

发布于 2015-06-09 13:45:27

stricmpstrincmp都是非标准函数。它们从来都不是C标准的一部分。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30733786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档