今天碰到一个很有意思的代码,苦想了半天才想明白是怎么回事。问题就出现在getchar()这个函数上。getchar()每次从输入读取一个字符,也就是一个字节,包括空格和换行都会算进去。
while((ch=getchar())!='q'&& ch!='Q')
{
if(ch=='\n')
continue;
while(getchar()!='\n')
continue;
ch = tolower(ch);
switch(ch)
{
}
}
上面的语句读取一个字符,如果字符是个回车键,就冒过不读,继续读取下一个字符,直到读到的字符不是回车键。当读到不是回车键的字符后,就判断它后面的字符是不是回车键,如果不是回车键就继续冒过,相当于只读取第一个不是回车键的字符,并冒过这个字符后面一直到回车键的所有字符。这样可以确保下次循环能读取到正确位置的字符。
scanf()和getchar()不同,它会以空格、回车、制表符作为分隔符,且能读取到其他数据类型的数据。当读取到正确类型的数据后,它有返回值,返回值为1.
continue和break不同,continue是跳过循环内剩下的代码,进入到下一个循环周期,而break顾名思义是直接跳出循环语句,进入到循环体外,当break在switch内时,是跳出switch,而不会跳出switch所在的循环体外。
还有个有意思的地方,就是getchar()任何时候都是对字符进行操作,在它眼中它读取的都是字符。就算你输入的是数字1,在它读取看来,它读的不是数字,是字符‘1’,如果将字符‘1’打印出来,显示的十进制是49,二进制是00110001。
运行结果: