zoukankan      html  css  js  c++  java
  • 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$

    问题解决。


  • 相关阅读:
    C++学习之路:纯虚函数
    C++学习之路:虚函数与多态
    C++学习之路: 虚继承的内存的模型
    grep命令与正则表达式
    C++学习:lambda表达式入门
    wxWidgets在LINUX下的安装和demos的编译
    C++学习之路: STL探索之 reverse_iterator 的一个小陷阱
    JAVA入门:http基础
    sql入门
    C++学习之路: 构造函数详解与初始化列表
  • 原文地址:https://www.cnblogs.com/java20130726/p/3218504.html
Copyright © 2011-2022 走看看