我是竞争性编程的新手,我看到人们没有使用传统的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()函数到底是做什么的,整个函数的重点是什么。我想这必须是优化代码以获取大量输入,但它是如何完成的。 这对于有经验的人来说一定是一个愚蠢的问题,但是因为我是新手,所以任何帮助都会受到赞赏。
答案 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*/ }