函数的隐式声明';扫描';[-Wimplicit函数声明]

函数的隐式声明';扫描';[-Wimplicit函数声明],c,compiler-errors,scanf,c11,tr24731,C,Compiler Errors,Scanf,C11,Tr24731,我一直在研究其他问题,但没有一个解决方案有效,所以我会问自己的问题 我在linux VM上工作,在编译代码时遇到问题,以下是我的include、编译器收到的错误及其引用的代码: 错误: linux.c:156:11:警告:函数“scan_s”的隐式声明[-Wimplicit函数声明] #包括 #包括 #包括 #包括“ctype.h” 扫描文件(“%[^\n]s”,文件名,maxFilename); scanf_s是边界检查扩展的一部分,您的编译器可能不支持该扩展。使用#ifdef uu STDC

我一直在研究其他问题,但没有一个解决方案有效,所以我会问自己的问题

我在linux VM上工作,在编译代码时遇到问题,以下是我的include、编译器收到的错误及其引用的代码:

错误:

linux.c:156:11:警告:函数“scan_s”的隐式声明[-Wimplicit函数声明]

#包括
#包括
#包括
#包括“ctype.h”
扫描文件(“%[^\n]s”,文件名,maxFilename);

scanf_s
是边界检查扩展的一部分,您的编译器可能不支持该扩展。使用
#ifdef uu STDC u LIB u EXT1 uu
查看您的库/实现是否支持它——如果不支持,请使用类似

char fmt[16];
sprintf(fmt, "%%%d[^\n]", maxFilename);
scanf(fmt, maxFilename, filename);

相反

请注意,示例的格式字符串中的
s
是非感官的,不会匹配任何内容(任何
s
都将被
%[^\n]
吸收,因为它不是换行符

据我所知,只有Microsoft编译器支持此扩展。

该函数的可能副本是非常新的,它是在C11标准中引入的,旧的Linux安装可能还没有。请显示确切的代码,或a。错误表明您使用了
scan\u s
而不是
scan\u s
char fmt[16];
sprintf(fmt, "%%%d[^\n]", maxFilename);
scanf(fmt, maxFilename, filename);
fgets(filename, maxFilename, stdin);
if (char *p = strchr(filename, '\n')) *p = '\0';