我正在尝试使用strlen()
函数查找字符串中的字符数。用户输入一个句子,并且代码必须显示字符串中的字符数。
int l;
char string[64];
printf("Enter a statement: \n");
scanf("%s",&string);
l = strlen(string);
printf("%d",l);
代码运行不正确,并显示以下警告: [警告]内置函数'strlen'的不兼容隐式声明
我确实在网上找到了正确的代码,但是我的逻辑到底出了什么问题?需要一点帮助。
答案 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
这会将上述警告替换为错误,这很不错,因为这是一个破坏程序的错误。