1

我正在尝试将宽字符读入标准输入的数组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);
    }
}
4

1 回答 1

1

不要忽略空格 ...
...尝试将宽字符读入 wchar_t 数组

要将一行文本(所有字符和直到 的空格'\n')读入一个宽字符串,请使用fgetws();

#define STR_SIZE 8
wchar_t str[STR_SIZE];

while (fgetws(str, STR_SIZE, str)) {
  // lop off the potential \n if desired
  size_t len = wcslen(str);
  if (len > 0 && str[len-1] == L'\n') {
    str[--len] = L'\0';
  }
  ...
}
于 2017-08-29T18:40:57.123 回答