• snprintf()使用Warn提示:warning: format not a string literal and no format arguments


    问题:

    使用snprintf()完成字符串的复制操作:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define ARR_SIZE(a)		(sizeof((a))/sizeof((a)[0]))
    #define LEN_BUF			5
    
    int main()
    {
    	char buf[] = "0123456789";
    	char buf1[LEN_BUF];
    	char buf2[LEN_BUF];
    	// char *buf2 = NULL;
    
    	// Source buf greater than dest buf1 causes stack overflow
    	// strcpy(buf1, buf);
    	// printf("buf1 is: %s\n", buf1);
    
    	// buf2 = calloc(LEN_BUF, sizeof(char));
    	memset(buf2, 0, LEN_BUF);
    	strncpy(buf2, buf, LEN_BUF);
    	printf("buf2 is: %s\n", buf2);
    	// free(buf2);
    
    	memset(buf2, 0, LEN_BUF);
    	snprintf(buf2, LEN_BUF, buf);
    	printf("buf2 is: %s\n", buf2);
    
    	return 0;
    }
    
    编译的时候出现错误提示:

    david@ubuntu:~/wrk/tmp$ gcc -o strcpy_compare strcpy_compare.c 
    strcpy_compare.c: In function ‘main’:
    strcpy_compare.c:42:2: warning: format not a string literal and no format arguments [-Wformat-security]
    strcpy_compare.c:42:2: warning: format not a string literal and no format arguments [-Wformat-security]
    david@ubuntu:~/wrk/tmp$ 

    解决办法:

    1. 根据提示,应该是format中没有占位符的参数。

    snprintf的函数原型是int snprintf(char *restrict buf, size_t n, const char * restrict  format, ...)

    给snprintf()加上格式指示符,

    snprintf(buf2, LEN_BUF, "%s", buf);
    重新编译,警告信息消失:

    david@ubuntu:~/wrk/tmp$ gcc -o strcpy_compare strcpy_compare.c 
    david@ubuntu:~/wrk/tmp$

    问题解决。


  • 相关阅读:
    Mysql的左外连接丶右外连接与内连接的区别
    常见的异常种类
    Mysql
    JSTL 标签库
    VMware的虚拟机为什么ip地址老是自动变化?
    redis出现的问题
    在Linux系统下启动了tomcat,但是在游览器中进步了服务
    Linux下安装JDK 与 tomcat
    wamp配置多站点域名
    终端链接操作redis
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218504.html
Copyright © 2020-2023  润新知