[英]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
:
否則只需使用*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.