0

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

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

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

4

4 回答 4

3

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

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

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

于 2013-06-13T21:17:02.907 回答
1

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

是的,这就是它正在做的事情。

于 2013-06-13T21:15:08.787 回答
1

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

于 2013-06-13T21:15:49.567 回答
0

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

于 2013-06-13T21:17:13.483 回答