getchar_unlocked()如何工作?

时间:2015-02-22 20:13:15

标签: c char getchar

我的问题是基于名为Lucky Four的CodeChef问题。

这是我的代码:

int count_four() {
  int count = 0;
  char c = getchar_unlocked();
  while (c < '0' || c > '9')
    c = getchar_unlocked();
  while (c >= '0' && c <= '9') {
    if (c == '4')
      ++count;
    c = getchar_unlocked();
  }
  return count;
}

int main() {
  int i, tc;
  scanf("%d", &tc);
  for (i = 0; i < tc; ++i) {
    printf("%d\n", count_four());
  }
  return 0;
}

我们说我对count_four()稍作修改:

int count_four() {
  int count = 0;
  char c = getchar_unlocked();
  while (c >= '0' && c <= '9') {
    if (c == '4')
      ++count;
    c = getchar_unlocked();
  }
  while (c < '0' || c > '9') // I moved this `while` loop
    c = getchar_unlocked();
  return count;
}

while循环移到另一个循环下方后,这是我的输出:

0
3
0
1
0

而不是:

4
0
1
1
0

用于测试程序的输入:

5
447474
228
6664
40
81  

为什么会这样? getchar()getchar_unlocked()如何运作?

1 个答案:

答案 0 :(得分:1)

getchar_unlocked只是一个较低级别的函数,用于从流中读取字节而不锁定它。在单线程程序中,它的行为与getchar()完全相同。

count_four函数中的更改会完全改变其行为。

原始函数读取标准输入。它会跳过非数字,导致文件末尾出现无限循环。然后它会对数字进行计数,直到获得'4'。计数结束。

您的版本读取输入,跳过数字,计算'4'的出现次数,然后跳过非数字,在EOF上显示相同的错误,最后返回计数。