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";
Другие вопросы по тегам