使用getchar_unlocked()

时间:2018-10-20 10:11:37

标签: c++ c++11 input

我最近了解到,使用getchar_unlocked()是读取输入的一种更快的方法。 我在互联网上进行搜索,发现下面的代码段: 但是我听不懂。

void fast_scanf(int &number)
{
    register int ch = getchar_unlocked();
    number= 0;

    while (ch > 47 && ch < 58) {
        number = number * 10 + ch - 48;
        ch     = getchar_unlocked();
    }
}

int main(void)
{
    int test_cases;fast_scanf(test_cases);

    while (test_cases--) 
   {
        int n;
        fast_scanf(n);
        int array[n];
        for (int i = 0; i < n; i++)
            fast_scanf(array[i]);
    }
return 0;
}

因此,对于给定数量的n,此代码接受大小为test_cases的整数数组的输入。我对函数fast_scanf一无所知,例如为什么这行:

while (ch > 47 && ch < 58) 
{ number = number * 10 + ch - 48;

为什么在声明ch时使用寄存器?

为什么函数中两次使用了getchar_unlocked()?等等.. 如果有人为我详细说明这将是很大的帮助。提前致谢!

1 个答案:

答案 0 :(得分:0)

好的,因为您的要求需要清楚地说明,所以我在这里写它...因此,我不会在评论中把它弄乱了...

函数:(对其进行了一些编辑以使其看起来更像 C ++标准

void fast_scanf(int &number)
{
    auto ch = getchar_unlocked();
    number= 0;
    while (ch >= '0' && ch <= '9')
    {
        number = number * 10 + ch - '0';
        ch     = getchar_unlocked();
    }
}

在这里,首先考虑一下ASCII Table,因为如果您不了解结果,您将不知道结果如何。

1)在这里,您有一个字符ch使用getchar_unlocked()占据了用户的输入字符(auto关键字会自动为您完成此操作并且仅在C ++中可用,而在C中不可用...

2)您将变量 number 分配为零,以便可以重复使用该变量,请注意,该变量是一个引用,因此它会在程序内部更改为好吧...

3) while (ch >= '0' && ch <= '9') ...如前所述,检查字符是否在ASCII数字限制内,类似于说该字符必须大于或等于48。但小于或等于57 ...

4)在这里,有些棘手,将变量 number 与自身乘以10以及所存储字符的实整数值相乘) ...

5)在下一行,重新分配了 ch ,这样您就不必永远停留在循环中,因为如果ch永远保持该数字,用户没有输入任何内容...请记住,循环返回到结束后声明的位置,检查条件是否为真,继续,如果条件为真,则中断)。


例如:456764

在这里,ch首先需要4,然后其他人跟随,所以我们首先选择4 ...

1) 数字将分配为零。 while循环检查给定字符是否为数字,如果继续,则循环将其中断...

2 0与10的乘积将为零 ... 并将其与48的差52(即'4')相加(即'0')为您提供4 实际数值,而不是char '4' )... 所以变量数现在是4 ...


  

其他情况也是如此...请参阅...

     

number = number * 10 + '5' - '0'

     

number = 4 * 10 + 53 - 48

     

number = 40 + 5

     

number = 45... etc, etc. for other numbers...