簡體   English   中英

如何使用變量參數列表,va_list,va_start,va_end將百分比字符寫入文件

[英]How to write percent character into a file using variable argument list, va_list, va_start, va_end

我需要在格式字符串中使用%%來編寫%字符,如下所示:

printf("%%");

我試圖在我的變量參數列表函數中執行此操作。 格式說明符可以正常工作,例如%d%s等。但是當我嘗試使用%%編寫%字符時,它不起作用。 為什么並且有什么解決方案?

void foo(LPCSTR sFrmtStr, ...)   
{   
    char buffer[4096] = { 0 };

    va_list argList;
    va_start(argList, sFrmtStr);
    vsprintf(buffer, sFrmtStr, argList);
    va_end(argList);

    printf(buffer);
}

當然 “它不起作用”。 在調用vsprintf()之后,您正在使用帶有單個%的字符串的字符串來調用printf

void foo(LPCSTR sFrmtStr, ...)   
{   
    char buffer[4096] = { 0 };

    va_list argList;
    va_start(argList, sFrmtStr);
    vsprintf(buffer, sFrmtStr, argList);
    va_end(argList);

    /* Now buffer holds a string with a single '%' in it */
    printf(buffer);
}

解決方法:

void foo(LPCSTR sFrmtStr, ...)   
{   
    /* doesn't need to be initialized */
    char buffer[4096];

    va_list argList;
    va_start(argList, sFrmtStr);
    /* assume vsnprintf is available */
    vsnprintf(buffer, sizeof( buffer ), sFrmtStr, argList);
    va_end(argList);

    /* puts() is probably better... */
    /* and fputs( buffer, stdout ) is even better... */
    fputs( buffer, stdout );
    /* printf("%s", buffer); */
}

您的代碼可用於以下用途:

#include <stdarg.h>
#include <stdio.h>

void foo(char* sFrmtStr, ...)   
{   
    char buffer[4096] = { 0 };

    va_list argList;
    va_start(argList, sFrmtStr);
    vsprintf(buffer, sFrmtStr, argList);
    va_end(argList);

    printf(buffer);
}

int main()
{
  foo("n=%d pct %%\n", 23);
  return 0;
}

輸出:

n = 23%

但是,gcc正確地不喜歡它帶有關於printf()的警告。 最好使用puts()而不是printf(),這樣就不必擔心printf可能試圖解釋的%雜散字符。

暫無
暫無

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

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