-1

我有这样的东西

char string[]="My name is %s";

printf("%s",string,"Tom");

我希望输出是,My name is Tom但我得到My name is %s

我试图逃避%角色,但它不起作用。

这里出了什么问题?我怎么会有一个%sinside a %s

4

5 回答 5

7

尝试这样的事情

printf(string,"Tom");

您的方法的问题是-

一旦在格式字符串中printf看到%s格式说明符,它就会假定 list 中的下一个参数是由字符指针指向的字符串,检索它并打印它来代替%s. 现在,printf不进行递归替换,因此 %s在你的string遗体中保持原样,“Tom”现在是一个额外的参数,只是被丢弃了。

于 2012-04-24T11:17:05.097 回答
4

期间只有一个扩展printf;这意味着传递给printf除格式字符串之外的任何字符串都将被逐字打印(如果有的话)。这实际上是一件好事,因为否则,它会留下一个巨大的安全漏洞。

安全风险与格式字符串和参数列表必须对应的事实有关。这意味着,如果不需要的%内容进入格式字符串,您将遇到麻烦:

char ch[50];
fgets(ch, 50, stdin);
printf(ch);

如果用户提供例如。%p %p %p %p,他将读取存储在堆栈中的数据(如返回地址等),如果他提供%s %s %s,他可能会崩溃程序。如果他提供%n,他将覆盖堆栈上的一些数据。

也就是说,如果需要,您可以只计算格式字符串:

char ch[50];
char format_prototype[]="My name is %s";
snprintf(ch, 49, "%s", format_prototype);
ch[49]=0;
printf(ch, "Tom");
于 2012-04-24T11:29:53.293 回答
1

printf(string, "Tom")也许?

于 2012-04-24T11:17:35.497 回答
1

第一个参数printf是格式字符串。其余的都是将根据格式字符串格式化的参数。格式字符串不会以任何方式嵌套。换句话说,即使要格式化的字符串恰好包含格式化指令,它也会被简单地打印出来,而不是解释为另一个格式字符串。

如果您想要这种格式间接,您必须首先生成一个新的格式字符串(sprintf对此很有用):

char string[] = "My name is %s";
char format[100];

sprintf(format, "%s", string);

然后使用新生成的格式字符串:

printf(format, "Tom");
于 2012-04-24T11:19:40.167 回答
1

问题出printf("%s",string,"Tom"); 在线路上你应该使用

char string[]="My name is %s";
printf(string,"Tom");

在这里你会得到输出

My name is Tom
于 2012-04-24T11:26:57.787 回答