将wscanf用于UTF-8时,请勿忽略空格

时间:2017-08-29 17:20:00

标签: c wchar-t specifier

我正在尝试从stdin读取宽字符到wchar_t的数组。但是,[^characters]的否定扫描集说明符(ls)无法按预期正常工作。

目标是我希望每个空格都被读入str而不是被忽略。因此,[^\n]是我尝试过的,但没有运气,结果令人沮丧,并继续将乱码文本打印到标准输出。

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <wchar.h>
#include <wctype.h>
#include <locale.h>

int main(void)
{
    wchar_t str[8];

    if (setlocale(LC_ALL, "en_US.UTF-8") == NULL)  {
        fprintf(stderr, "Failed to set locale LC_ALL = en_US.UTF-8.\n");
        exit(EXIT_FAILURE);
    }

    // correct (but not what I want)
    // whitespaces and EOLs are ignored
    // while (wscanf(L"%7ls", str) != EOF)  {
    //     wprintf(L"%ls", str);
    // }

    // incorrect
    // whitespaces (except EOLs) are properly read into str (what I want)
    // input: 不要忽略白空格 (for instance)
    // output: endless loop (garbled text)
    while (wscanf(L"%7[^\n]ls", str) != EOF)  {
        if (ferror(stdin) && errno == EILSEQ)  {
            fprintf(stderr, "Encountered an invalid wide character.\n");
            exit(EXIT_FAILURE);
        }
        wprintf(L"%ls", str);
    }
}

1 个答案:

答案 0 :(得分:1)

  

不要忽视空白......
  ...尝试将宽字符读入wchar_t

数组

要读取一行 text (所有字符,以及最多'\n'的空格)到宽字符字符串,请使用{{1} };

fgetws()