2016-08-02 134 views
1

是否有可能在另一个字符串标识符中包含字符串标识符并打印整个事物?例如:另一个字符串中的字符串标识符

int main() 
{ 
    char *str1 = "%s says:"; 
    char *name = "John"; 
    printf("%s\n", str1, name); 
    return(0); 
} 

我的预期产出是John says:。我将如何printf或sprintf这样的东西?

+4

你试过了吗? 'printf(str1,name)'不会更有意义? –

+0

...并注意'printf(“%s \ n”,str1,name);'有一个格式说明符,但有两个参数。第二个将被忽略。 –

+0

什么是“字符串标识符”? – Olaf

回答

1

想一想printf()在做什么。

printf()看到“%s”并将其解释为,打印指示的字符串。指定的字符串恰好包含字符“%s”:printf()如何知道?它不会自动重新扫描和重新扫描。

有一个循环如何。收集字符和sprintf()他们到一个缓冲区。每次,如果字符串中还有另一个'%',请重新应用sprintf()。完成后,只需使用puts()字面翻转字符串即可。

+0

好吧,它可以递归地解释字符串。原因'printf'不能这样工作并不是因为这是不可能的,但是出于安全原因(如果用户提供的字符串要被打印怎么办?这是一个非常糟糕的主意 - 这是人们总是应该使用众所周知的格式字符串)和复杂性。该功能已经是标准库中最大的功能之一(与'scanf'系列一起)。 – Olaf

2

不,printf不能这样工作。你将不得不为此在两个不同的阶段:

const char *fmt = "%s says: "; 
char result1[SIZE];    // where SIZE is large enough to hold the result 
sprintf(result, fmt, "John"); // result now contains "John says: " 
printf("%s\n", result);  // writes "John says: " to standard output 

我不得不做这个变化多次,在这里我需要即时构建格式字符串。这很简单。

+0

有趣的是,当你调用包含*格式字符串*'fmt'的变量时,它会更有意义... –

相关问题