我想写上打印指定窗口消息的mvwprint / mvwchgat ncurses的功能的包装函数,然后改变其属性。
然而,mvwchgat需要知道有多少个字符改变-我不知道如何mvwchgat告诉格式化字符串是怎么长的,因为在strlen的(),例如, "abc%d"
显然返回5,由于strlen不知道%d
代表...
我想写上打印指定窗口消息的mvwprint / mvwchgat ncurses的功能的包装函数,然后改变其属性。
然而,mvwchgat需要知道有多少个字符改变-我不知道如何mvwchgat告诉格式化字符串是怎么长的,因为在strlen的(),例如, "abc%d"
显然返回5,由于strlen不知道%d
代表...
在C99或C11,您可以用这样一行:
length = snprintf(NULL, 0, format_string, args);
从手工snprintf
(重点煤矿):
的功能的snprintf()和vsnprintf()不写比大小字节(包括终止空字节(“\ 0”))以上。 如果输出是由于这个限制被截断,则返回值是一个字符这将被写入最后的字符串,如果有足够的空间已经提供的数(不包括终止空字节)。 因此,大小或更大的返回值意味着输出被截断。
因为我们给snprintf
0的大小,则输出始终是截断和输出snprintf
将是将已写入的字符数,这基本上是字符串的长度。
在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 */
你可以事先不知道您的字符串有多长:
printf("abc%d", 0); //4 chars
printf("abc%d", 111111111);//12 chars
都具有相同的格式字符串。
唯一可靠的方法就是sprintf
讨论的文字到缓冲区, strlen(buffer)
的结果和printf("%s", buffer);
结果筛选。
该解决方案在分配足够长的时间缓冲的成本避免双重格式。