Указание набора сканирования вместе с модификатором ширины 'h' в "swscanf" не работает с MSVC - PullRequest
0 голосов
/ 04 августа 2020

Я хотел бы сохранить результат чтения в широкой строке, используя swscanf , в узкую строку, но я хотел бы читать все ввод до символа новой строки. У меня есть следующий простой пример кода, чтобы продемонстрировать, что я имею в виду:

#include <stdio.h>

int main()
{
    const wchar_t* source_string = L"Hello world\n";
    char new_string[100];

    swscanf(source_string, L"%h[^\n]", new_string);
    wprintf(L"%hs", new_string);
    return 0;
}

Это отлично работает с g cc, но выводит мусор с MSV C с предупреждением:

warning C4475: 'swscanf' : length modifier 'h' cannot be used with type field character ']' in format specifier

Обратите внимание, что wprintf , приведенное выше, предназначено только для проверки и просмотра результатов.

Есть ли способ обойти это? Это просто MSV C не соответствует действующим стандартам ANSI C printf / scanf?

1 Ответ

2 голосов
/ 04 августа 2020

Набор сканирования %[...] по умолчанию использует узкие символы, даже для swscanf.

Префикс h не поддерживается для %[...] в стандартном C.

Также обратите внимание, что префикс h для %s (т.е. %hs) является расширением MSV C, он не определен в стандарте C.

...