簡體   English   中英

vsnprintf和gcc

[英]vsnprintf and gcc

我有以下聲明:

vsnprintf(target, size - 1, "%ls_%ls", str16_1, str16_2);

為什么這在gcc上失敗?

我在Windows上這樣使用它:

vsnprintf(target, size - 1, "%S_%S", str16_1, str16_2);

並按預期工作。 在gcc文檔中,我發現%S是%ls的同義詞,但是我不能使用它。 我也嘗試了%S,但無法正常工作。 我在帶有可變參數列表的函數中使用它。 是否可能因為我更改了傳遞給va_start的格式變量而無法工作? 我必須搜索%S並將其替換為格式變量中的%ls。

該功能類似於:

void f(const char* format, ...){
  char* new_format = format with %S replaced with %ls;
  va_list argptr;
  va_start(args, format);
  vsnprintf(str, size-1, new_format, argptr);
}

我檢查了並且new_format是正確的。

謝謝!

嘗試使用snprintf ,原因是vsnprintf vsnprintf接受類型為va_list的參數,而不是字面量可變參數列表。 例如:

va_list ap;
va_start (ap, first_arg_in_this_function);
vsnprintf (buf, size, format_str, ap);
va_end (ap);

而sprintf:

snprintf (buf, size, format_str, x, y);

在以下情況下使用v*printf

  1. 圍繞printf樣式函數進行包裝
  2. 可變參數宏不是一種選擇

否則只需使用*printf

您對va_start使用不正確。 在此語句中:

va_start(args, new_format);

您不是在指f()函數的format參數。 va_start()的第二個參數必須引用該函數的形式參數列表中的一個參數。 其他可能是不確定的行為。

編譯器使用va_start()的命名形式參數來確定從哪里開始尋找函數調用中的變量參數列表。 它不會自動知道將...放在參數列表中的位置(也許您可能希望這樣做,但這不是它的工作原理)。

我在%ls查找了vsnprintf ,發現這是用於打印/格式化一串寬字符的格式說明符,即wide_t *p = L"Hello world!";

在C ++中花了一些時間玩弄和搜索廣泛的字符用法(我喜歡下面的頁面: http : //www.linux.com/archive/feed/51836 ),但是我想我已經找到了您的問題。

如果將char字符串傳遞給%ls則它不會擴展,但是如果將wchar_t字符串傳遞給%ls 它將打印。

根據您的信息考慮以下示例代碼:

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


char       str[100];


void f (const char    *format,
        ...)
{
    va_list    args;

    va_start(args, format);
    vsnprintf(str, sizeof(str), format, args);
    va_end(args);
}




int
main ()
{
    char    *p1 = "1234";
    char    *p2 = "abcd";

    wchar_t    *pw1 = L"9876";
    wchar_t    *pw2 = L"wxyz";



    f("%d_%d", 120, 199);
    printf("numbers: %s\n", str);


    f("%s_%s", p1, p2);
    printf("char*: %s\n", str);


    f("%ls_%ls", p1, p2);
    printf("wide char* with char* input: %s\n", str);


    f("%ls_%ls", pw1, pw2);
    printf("wide char* with wide char* input: %s\n", str);


    return (0);
}

我用g ++編譯了這個。

make newtest.exe
g++ -g -c -MD -Wall -Werror  newtest.cxx
g++ -o newtest.exe newtest.o -lc -lrt

Compilation finished at Thu Jul 29 08:54:57

輸出如下:

[SUSE10.1]:201> newtest.exe
numbers: 120_199
char*: 1234_abcd
wide char* with char* input: 
wide char* with wide char* input: 9876_wxyz

使用snprintf

您的valist類型是什么? 變量列表參數的正確類型是帶有下划線的va_list ,不是嗎?

因為我在Mac上使用了此功能,所以找到了一種解決方法:

如何將可變數量的參數“傳遞”給NSString的+ stringWithFormat:

似乎vsnprintf無法處理16位字符串。 可能是因為wchar_t不是16位。

暫無
暫無

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

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