我想为以下内容编写一个包装函数mvwprint/mvwchgat ncurses在指定窗口中打印消息然后更改其属性的函数。
然而,mvwchgat需要知道它应该改变多少个字符 - 我不知道如何告诉mvwchgat格式化字符串有多长,因为strlen()例如,"abc%d"
显然返回 5,因为strlen不知道什么%d
代表 ...
在 C99 或 C11 中,您可以使用如下行:
length = snprintf(NULL, 0, format_string, args);
来自的手册snprintf(强调我的):
函数 snprintf() 和 vsnprintf() 写入的内容不会超过 size 字节(包括终止空字节 ('\0'))。如果输出由于此限制而被截断,则返回值是在有足够空间可用的情况下将写入最终字符串的字符数(不包括终止空字节)。因此,返回值 size 或更大意味着输出被截断。
既然我们给予snprintf
0作为大小,那么输出总是被截断并且输出snprintf
将是字符数would已经写好了,基本上就是字符串的长度了。
在 C89 中,你没有snprintf
。解决方法是创建一个临时文件,或者如果您在 *nix 中打开/dev/null
并写下这样的内容:
FILE *throw_away = fopen("/dev/null", "w"); /* On windows should be "NUL" but I haven't tested */
if (throw_away)
{
fprintf(throw_away, "<format goes here>%n", <args go here>, &length);
fclose(throw_away);
} /* else, try opening a temporary file */
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)