我知道%%
用于转义字符串中的实际%
符号,因此%%%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
写入buf
,see 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: