segfault使用区域设置读取面向广泛的流

时间:2015-12-30 16:32:38

标签: c locale

我在使用语言环境的程序中遇到问题,并使用project.xml函数从stdin读取。

fgetws

当输入足够长(5个或更多个字符)时,如果我在#include <stdio.h> #include <locale.h> #include <wchar.h> static const int N = 2; int main(void) { setlocale(LC_ALL, ""); wchar_t data[N]; fgetws(data, N, stdin); printf("%ls\n", data); /* fclose(stdin); */ return 0; } 之前没有关闭stdin,我会遇到段错误。这是为什么?这个程序有什么问题?

1 个答案:

答案 0 :(得分:1)

怀疑fgetws(data, 2, stdin)已被破坏。

fgetws(),使用这样一个小缓冲区,最多只能从wchar_t读取1 stdin并附加一个有争议的(wchar_t) '\0'

像往常一样,当代码神秘失败时,最好检查函数的返回值,看看它们是否符合预期。

#include <stdio.h>
#include <locale.h>
#include <wchar.h>

#include <assert.h>
#include <stdio.h>
#include <locale.h>
#include <wchar.h>

static const int N = 2;

int main(void) {
  char *p = setlocale(LC_ALL, "");
  assert(p);

  wchar_t data[N];
  wchar_t *s = fgetws(data, N, stdin);
  assert(s); 

  int i = printf("%ls\n", data);
  assert(i == 2);

  i = fclose(stdin);
  assert(i == 0);
  return 0;
}