2010-10-08 52 views
3

在大學學習C。這不是一項家庭作業,但我正在嘗試做一些事情(作業中的某些「創意」部分)並陷入困境。C:printf中的sprintf作爲第一個參數

我明白,這是可能的

printf("%d\n", printf("23.4")); // -> 23.44 (i.e. 23.4 + 4 bytes written) 

,但我該如何使用sprintf()printf()第一個參數?

類似:

char * getFormatString(int n) { 
    char * buffer; 

    sprintf(buffer, "Value with %%d decimals is %%.%df", n); 

    return buffer; 
} 

void foo() { 
    int decimals = 2; 
    float pi = 3.141592; 

    printf(getFormatString(decimals), decimals, pi); // should output "Value with 2 decimals is 3.14" 
} 

這甚至可能嗎?到目前爲止,我在執行時遇到seg故障。

回答

6

爲此目的使用sprintf是不正當的。相反,嘗試:

printf("Value with %d decimals is %.*f", decimals, decimals, pi); 
+0

優秀!你有我的尊重,我站在糾正:)我從來沒有聽說過這種行爲(閱讀http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.12.html) – 2010-10-08 15:46:20

2

你應該至少爲您的緩衝區分配內存第一(和遊離它在最後):

char * buffer; 
int decimals = 2; 
float pi = 3.141592; 

buffer = (char *) malloc(256); /* big enough buffer */ 
sprintf(buffer, "Value with %%d decimals is %%.%df", decimals); 
printf(buffer, decimals, pi); 

free(buffer); 
+0

好吧,我明白了。但是,如果sprintf()和printf()位於不同的函數中?一個函數返回一個char *作爲printf函數的第一個參數? – 2010-10-08 15:35:38

+0

@Yanick'sprintf()'返回一個int。 – Ruel 2010-10-08 15:37:27

+0

@Yanick我認爲你使用的單詞「回報」錯了。 printf/sprintf都是* return * ints。但他們以* char *作爲他們的第一個論點。 – paleozogt 2010-10-08 15:37:31

2

printf返回打印的字符的數目,所以你的第一個例子實際上是

printf("%d", printf("23.4")); // -> 23.44 

sprintf也返回打印的字符數,所以讓它成爲printf的參數可能不是你想要的。

你的區分原因是你的緩衝區字符串沒有指向任何東西。你想改變你的代碼是這樣的:

char buffer[1024]; // buffer has to be an actual string (or you could use malloc) 
int decimals = 2; 
float pi = 3.141592; 

sprintf(buffer, "Value with %%d decimals is %%.%df", decimals); 

printf(buffer, decimals, pi); 
0

printf()sprintf()都返回一個int值。這是字符的總數。

int sprintf (char * str, const char * format, ...); 
int printf (const char * format, ...); 

您只能使用sprintf()作爲參數傳遞給printf(),如果你要打印由sprintf()寫的字符數。

1

您正在收到段錯誤,因爲sprintf會將數據寫入垃圾指向的內存中某處(指針buffer)。你需要使用malloc分配一些內存,如:

buffer = malloc(100); 

您在功能getFormatString用sprintf之前。然後,請記住在使用字符串後釋放該內存。在這個特定的代碼中存在內存泄漏,因爲您不存儲從任何地方返回的指針getFormatString

更正代碼:

char *getFormatString(int n) { 
    char *buffer = malloc(100); 
    sprintf(buffer, "Value with %%d decimals is %%.%df", n); 
    return buffer; 
} 

void foo() { 
    int decimals = 2; 
    float pi = 3.141592; 
    char *fmtstr = getFormatString(decimals); 
    printf(fmtstr, decimals, pi); // should output "Value with 2 decimals is 3.14" 
    free(fmtstr); 
} 
相關問題