我的问题基于一个称为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()如何工作?

最佳答案

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

您在count_four函数中所做的更改将完全改变其行为。

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

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

关于c - getchar_unlocked()如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28662687/

10-11 15:42