簡體   English   中英

C:printf里面的sprintf作為第一個參數

[英]C : sprintf inside printf as first argument

在大學學習C語言。 這不是一個家庭作業,但我試圖做一些事情(一些“創造性”的任務部分)並陷入困境。

我知道這是可能的

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錯誤。

為此目的使用sprintf是不正確的。 而是嘗試:

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

您至少應該首先為緩沖區分配內存(並在結束時釋放它):

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);

printf返回打印的字符數,因此您的第一個示例實際上是

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

sprintf也返回打印的字符數,因此將它作為printf的參數可能不是你想要的。

你是seg-faulting的原因是你的緩沖區字符串沒有指向任何東西。 您想將代碼更改為以下內容:

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);

你得到一個段錯誤,因為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);
}

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

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

如果要打印sprintf()寫入的字符數,則只能使用sprintf()作為printf()的參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM