如何在格式化字符串上使用strlen()?

Unc*_*lan 0 c string ncurses strlen formatted

我想为mvwprint/mvwchgat ncurses函数编写一个包装函数,它在指定的窗口中打印消息,然后更改其属性.

但是,mvwchgat需要知道它应该改变多少个字符 - 而且我不知道如何告诉mvwchgat格式化的字符串有多长,因为strlen() on,"abc%d"显然会返回5,因为strlen不知道是什么%d代表 ...

Sha*_*baz 8

在C99或C11中,您可以使用如下所示的行:

length = snprintf(NULL, 0, format_string, args);
Run Code Online (Sandbox Code Playgroud)

从(强调我的)手册snprintf:

函数snprintf()和vsnprintf()写入的字节数不超过大小(包括终止空字节('\ 0')).如果输出由于此限制而被截断,则返回值是字符数(不包括终止空字节),如果有足够的空间,则该字符数将被写入最终字符串.因此,大小或更大的返回值意味着输出被截断.

由于我们给予snprintf0的大小,则输出始终是截断,输出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 */
Run Code Online (Sandbox Code Playgroud)