【问题标题】:Warnings using format strings with sprintf() in C++在 C++ 中使用带有 sprintf() 的格式字符串的警告
【发布时间】:2010-09-25 04:50:48
【问题描述】:

编译这一行

    long int sz;
    char tmpret[128];

    //take substring of c, translate in c string, convert to int, 
    //and multiply with 1024
    sz=atoi(c.substr(0,pos).c_str())*1024;

    snprintf(tmpret,128,"%l",sz); 

我在 snprintf 行读到两个警告:

 warning: conversion lacks type at end of format
 warning: too many arguments for format

为什么?指定了类型(long int sz,和 snprintf 中的 %l),并且 snprintf 中的参数只有一个。有谁能够帮我?谢谢。

【问题讨论】:

    标签: c++ types format printf


    【解决方案1】:

    您的格式缺少类型,因为 l 是“sizeof”修饰符。应该是 %ld

    【讨论】:

      【解决方案2】:

      查看printf format specifiers的列表

      %l 的注释是:

      参数被解释为长 int 或 unsigned long int 表示整数 说明符(i、d、o、u、x 和 X),以及 作为宽字符或宽字符 说明符 c 和 s 的字符串。

      【讨论】:

        【解决方案3】:

        boost::lexical_cast<string>(sz) 更好,无论如何。

        【讨论】:

          【解决方案4】:

          int sprintf(char * str, const char * format, ...);

          它不需要“str”的长度,作为第二个参数。 字符串指针/数组名的名字就够了。

          【讨论】:

          • sprintf() 非常不安全,因为它没有进行边界检查。您最好使用替代方案(如果可用)以避免缓冲区溢出。
          猜你喜欢
          • 2012-01-19
          • 1970-01-01
          • 2023-03-15
          • 1970-01-01
          • 2014-01-22
          • 1970-01-01
          • 2021-10-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多