用户定义的函数用于竞争性编程以获取输入

时间:2017-09-16 19:24:11

标签: c++

我是竞争性编程的新手,我看到人们没有使用传统的I / O流,例如cin或scanf(),而是定义了自己的函数来获取输入。有一个这样的功能,我遇到了很多次,我没有得到代码。这是

int get(){
    char ch;
    while(ch=getchar(),(ch<'0'||ch>'9')&&ch!='-');
    if (ch=='-'){
        int s=0;
        while(ch=getchar(),ch>='0'&&ch<='9')s=s*10+ch-'0';
        return -s;
    }
    int s=ch-'0';
    while(ch=getchar(),ch>='0'&&ch<='9')s=s*10+ch-'0';
    return s;
}

这个getchar()函数到底是做什么的,整个函数的重点是什么。我想这必须是优化代码以获取大量输入,但它是如何完成的。 这对于有经验的人来说一定是一个愚蠢的问题,但是因为我是新手,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:2)

while(ch=getchar(),(ch<'0'||ch>'9')&&ch!='-');

跳过所有输入,直到0,1,2,3,4,5,6,7,8,9或 - 被读取

if (ch=='-'){

如果读取负号,请继续读取数字:

    int s=0;

以零之和

开头
    while(ch=getchar(),ch>='0'&&ch<='9')s=s*10+ch-'0';

在读取数字时,通过将前一个1位小数向左移动(乘以10)并添加下一个数字(减去0的ascii值离开'0' - > 0来保持累加和,'1' - &gt; 1等)。

    return -s;

返回总和,但为负数。

如果否定标志不存在,我们确实完全相同,但返回正数。

注意

没有解析分隔符,嵌入空格,正号(+123),也没有任何范围/溢出检查。值得注意的怪癖:&#34; aaaaa - &#34;将被解析为0

结论:

不要这样做。使用scanf或int i; if (std::cin >> i) { /*something*/ }