将一些代码从sprintf移到snprintf - 在这个奇怪的事件中偶然发现:
sprintf(buf+strlen(buf), "ypasZ%c%c", iItem, val);
我不明白那里发生了什么:http://www.cplusplus.com/reference/cstdio/sprintf/没有帮助。 第一个参数(写入位置)是否按其大小“递增”? =>这是否意味着写入的位置不是buf但是buf增加了它的大小? 或者它是否将写入块的位置预先设置为buf中现有字符串的位置,以便附加文本?
答案 0 :(得分:3)
是的,它附加了。 sprintf的第一个参数是它将写入结果的地址(指针)。
如果buf是一个char数组,编译器(在这种情况下)将把它当作一个指针。添加它会增加地址。添加长度将指向字符串的当前结尾。
基本上第一个参数是address of string plus length of string that is there
,给出字符串结尾的地址,而不是开头,所以sprintf命令会将结果写到当前字符串的末尾。
答案 1 :(得分:1)
或者是否将写入块的位置预先设置为buf中现有字符串的位置,以便附加文本?
是的,这就是它正在做的事情。
答案 2 :(得分:1)
第一个参数是指向sprintf
应该写入格式化字符串的区域的指针。 buf + strlen(buf)
表示终止NULL字符('\0'
)的地址。 sprintf
只是从该NULL字符开始写入内存,从而继续buf
中的字符串。
答案 3 :(得分:0)
这意味着buf可能被定义为大小为n char buf[n]
的数组。使用strlen(buf)
是必要的,因为它会在buf
中返回指向字符串末尾的指针,从而附加到它。