我的问题基于一个称为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/