Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在竞争性编程中用于获取输入的用户定义函数_C++ - Fatal编程技术网

C++ 在竞争性编程中用于获取输入的用户定义函数

C++ 在竞争性编程中用于获取输入的用户定义函数,c++,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'&

我不熟悉竞争性编程,我见过有人不使用传统的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;
}
int get(){
char ch;
而(ch=getchar(),(ch'9')&&ch!='-');
如果(ch='-'){
int s=0;
而(ch=getchar(),ch>='0'&&ch='0'&&ch
如果读取负号,则继续读取数字:

    int s=0;
从零和开始

    while(ch=getchar(),ch>='0'&&ch<='9')s=s*10+ch-'0';
返回总和,但为负数

如果否定符号不存在,我们会做完全相同的操作,但返回肯定

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

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

C++格式的输入与许多备选输入(例如
getchar()
)相比非常慢。在性能是一个因素的比赛中,这是一种相对容易的大幅提高性能的方法。“优化代码以获取大量输入”编写不可读的代码不是一种方法。只要使用
std::cin
(或者
std::scanf
,如果需要的话)。如果您配置文件,并且I/O是瓶颈,那么您可以开始编写手动输入函数,但我怀疑它是否更快。@Raket1111我通常使用std::cin,但我想了解这段代码。这似乎不是针对大输入优化的,而是针对输入单整数而不进行任何错误检查。事实上你不明白它的作用是表明它不是很好的代码。在好的代码中,发生的事情是显而易见的。:-@BoPersson什么迫使人们不要简单地使用std::cin或scanf()。有什么正当的理由吗。谢谢你回答我的问题。我不明白为什么人们在竞争性编程中使用这种函数,我们需要快速地做事情,为什么要使事情复杂化。使用这种函数有什么正当的理由吗。可能是来自C/汇编背景的人。真的,没有其他解释了也许他们只是靠复制/粘贴生活
    int s=0;
    while(ch=getchar(),ch>='0'&&ch<='9')s=s*10+ch-'0';
    return -s;