【问题标题】:sprintf concatenated arguments: sprintf ( a+b, "")sprintf 级联参数:sprintf (a+b, "")
【发布时间】:2013-06-13 21:12:51
【问题描述】:

将一些代码从 sprintf 移动到 snprintf - 偶然发现了这种奇怪的现象:

sprintf(buf+strlen(buf), "ypasZ%c%c", iItem, val);

我不明白那里发生了什么:http://www.cplusplus.com/reference/cstdio/sprintf/ 没有帮助。 第一个参数(写入位置)是否按其大小“增加”? => 这是否意味着正在写入的位置不是 buf 而是 buf 按其大小递增? 还是将写入块的位置预先设置为buf中现有字符串的位置,以便追加文本?

【问题讨论】:

  • 你添加了那些** 字符吗?我把它们拿出来了,因为它们(大概)不是代码的一部分。
  • 考虑 strcpy(buf+strlen(buf), "foo"); 这是一个穷人的追加...如果使用多个打印语句构建可能会很方便。

标签: c++ c printf


【解决方案1】:

是的,它是附加的。 sprintf 的第一个参数是将写入结果的地址(指针)。

如果 buf 是 char 数组,编译器(在这种情况下)会将其视为指针。添加到它会增加地址。添加长度 what is there 将指向字符串的当前结尾。

基本上第一个参数是address of string plus length of string that is there,给出了字符串结尾的地址,而不是开头,所以 sprintf 命令会将其结果直接写入当前字符串的结尾。

【讨论】:

  • sprintf() 的正确端口应该是 "SnPrintf(buf+strlen(buf), DEF_BUF_SIZE-1, "YpasZ%c%c", iItem, val );"或 "SnPrintf(buf+strlen(buf), DEF_BUF_SIZE-1 - strlen(buf) , "YpasZ%c%c", iItem, val);"还是别的什么?
  • @PierreJohnson - DEF_BUF_SIZE-1 不会。您需要将缓冲区大小减去 ((buf + strlen(buf)) - p),其中 p 是分配的开始(可能与 buf 相同,但从您的示例中不清楚。)
  • Pierre:是的,snprintf 的正确端口需要从缓冲区大小中减去 strlen(),正如您所指出的那样。
【解决方案2】:

还是把写块的位置预先设置到buf中已有字符串的位置,从而追加文本?

是的,它就是这么做的。

【讨论】:

    【解决方案3】:

    第一个参数是指向sprintf 应该写入格式化字符串的区域的指针。 buf + strlen(buf) 表示终止 NULL 字符的地址 ('\0')。 sprintf 只是从那个 NULL 字符开始写入内存,从而继续 buf 中的字符串。

    【讨论】:

      【解决方案4】:

      这意味着 buf 可能被定义为一个大小为 n 的数组,char buf[n]。使用strlen(buf) 是必要的,因为它会返回一个指向buf 中字符串结尾的指针,从而附加到它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-10
        • 2023-03-26
        • 1970-01-01
        • 1970-01-01
        • 2021-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多