2016-08-02 131 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'的變量時,它會更有意義... –

相關問題