fwprintf: только первый символ из аргумента широкого массива символов копируется на вывод
Я пытаюсь написать сообщение, содержащее "alpha = abcd" в текстовый файл, используя следующий код:
#include <stdio.h>
#include <wchar.h>
int
main()
{
const wchar_t *a = L"abcd", *msg = L"alpha = %s\n";
FILE *f = fopen("./deleteme", "a");
fwprintf(f, msg, a);
fclose(f);
}
Однако после компиляции и выполнения программы я получаю вместо этого:
альфа = а
Почему только первый персонаж из конст a
копируется на выход?
2 ответа
Решение
Вам нужно изменить:
L"alpha = %s\n";
чтобы:
L"alpha = %S\n";
Аргумент (a = L"abcd"
) вы пытаетесь распечатать это широкая строка, и поэтому вам нужно %S
(заглавные буквы) вместо %s
(В нижнем регистре). Использование неверных спецификаторов формата для printf
-подобные функции - неопределенное поведение.
Прочитайте документацию для спецификаторов формата printf.
С C99-совместимым компилятором используйте "%ls"
,
Если
l
присутствует модификатор длины, аргумент должен быть указателем на начальный элемент массиваwchar_t
тип. C11dr §7.29.2.1 10.
// const wchar_t *msg = L"alpha = %s\n";
const wchar_t *msg = L"alpha = %ls\n";