我知道%%用于转义字符串中的实际%符号,因此%%%ds将以以下格式字符串结尾为%10s,但是我不知道为什么我需要在此字符串中使用%%5s吗?

毕竟,只有两个附加参数(BUFFSIZE/10)。

#define BUFFSIZE 100
char buf[100]={0}
sprintf(buf, "%%5s %%%ds %%%ds", BUFFSIZE / 10, BUFFSIZE / 10);

运行上面的代码后,buf将包含字符串,
%10s %10s

最佳答案

目的是获取格式字符串以在需要诸如sscanf()之类的格式字符串的另一个函数中使用它。

使用您的代码,您将获得:%5s %10s %10s写入bufsee online,这意味着它将接受三个带有长度标识符的字符串。

%%5s          --> %5s
%%%ds with 10 --> %10s (read it that way: {%%}{%d}{s})

该缓冲区%5s %10s %10s现在可以在sscanf()调用中使用,如here所示。

但是,有一种最佳实践是防止由sscanf()引起的缓冲区溢出,Kernighan和Pike在其书The Practice of Programming中也对此进行了描述,请参见here on SO

您可能无法使用%*s的原因可能是,请参阅here on SO:

10-04 13:28