是什么引起“不兼容的隐式声明”警告?

时间:2019-08-13 07:22:41

标签: c strlen

我正在尝试使用strlen()函数查找字符串中的字符数。用户输入一个句子,并且代码必须显示字符串中的字符数。

int l;
char string[64];
printf("Enter a statement: \n");
scanf("%s",&string);
l = strlen(string);
printf("%d",l);

代码运行不正确,并显示以下警告: [警告]内置函数'strlen'的不兼容隐式声明

我确实在网上找到了正确的代码,但是我的逻辑到底出了什么问题?需要一点帮助。

2 个答案:

答案 0 :(得分:7)

首先观察

  

该代码无法正确运行,并显示以下警告:[警告]   内置函数'strlen'的不兼容隐式声明

这是因为您没有包括strlen的必要标头。

#include <string.h>

第二,这里:

scanf("%s",&string);

string是字符数组和数组名称本身的地址,因此在扫描&时不需要。

scanf("%s", string); /* remove & */

此外,请始终检查scanf之类的函数的返回值。检查scanf()的手册页以了解返回的内容。例如:

int ret = scanf("%s", string);
if (ret == 1) {
    /* success, proceed further */
}
else {
   /* proper error handling */
}

答案 1 :(得分:2)

警告的原因是忘记包含string.h

警告的详细含义是,在90年代的早期C语言中,使用函数而不声明它是有效的。因此,如果您没有在找到声明的地方提供像string.h这样的相关标头,则编译器将“猜测”您想要的函数格式,并尝试在“行之间”静默声明函数。

编译器会隐式地为您提供此信息:

int strlen (); // accepts any parameters

但是真正正确的strlen声明是这样的:

size_t strlen (const char *s);

这些不是兼容类型,因此警告有关不兼容声明。 strlen函数的实际定义与后者匹配,但与前者不匹配,因此这是一个错误。

从1999年开始,隐式函数声明从C语言中删除,因为它们很危险。如果您以某种方式进行配置,则gcc编译器仍然允许过时的样式C。

如果您是初学者,则应始终使用严格且符合标准的设置进行编译:

gcc -std=c11 -pedantic-errors -Wall -Wextra

这会将上述警告替换为错误,这很不错,因为这是一个破坏程序的错误。