我的问题是基于名为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()
如何运作?
答案 0 :(得分:1)
getchar_unlocked
只是一个较低级别的函数,用于从流中读取字节而不锁定它。在单线程程序中,它的行为与getchar()
完全相同。
count_four
函数中的更改会完全改变其行为。
原始函数读取标准输入。它会跳过非数字,导致文件末尾出现无限循环。然后它会对数字进行计数,直到获得'4'
。计数结束。
您的版本读取输入,跳过数字,计算'4'
的出现次数,然后跳过非数字,在EOF上显示相同的错误,最后返回计数。