输入缓冲区 键盘缓冲区
这三个函数都是从输入缓冲区中读取输入的数据的。
如果缓冲区有残留数据时,读的就是残留数据而不从键盘缓冲区读取。
scanf和getchar:
字符:
int main()
{
char ch1, ch2;
scanf("%c", &ch1);
scanf("%c", &ch2);
printf("%d %d\n", ch1, ch2);
return 0;
}
int main() { char ch1, ch2; ch1 = getchar(); ch2 = getchar(); printf("%d %d\n", ch1, ch2); return 0; }
本意是:从键盘读入两个字符,然后打印出这两个字符的ASCII码值。
输入a 空格发现程序自动打出了 97 10.
输入缓冲区现在有a和回车
第一个scanf从输入缓冲区取走a 遇到回车读取结束
第二个scanf取走了回车。
getchar同样道理。
getchar先读取a遇到回车结束
第二个getchar读取回车,结束。
于是显示的就是a的ASCII码97和\10。
getchar吃回车!!!!!!
读取字符,没有舍弃回车。
再来看看读取字符串:gets(),getchar(),scanf(%s,)
输入int main() { char str1[20], str2[20]; scanf("%s",str1); printf("%s\n",str1); scanf("%s",str2); printf("%s\n",str2); return 0; }
Hello[Enter]
Hello[输出]
world[Enter]
world[输出]
说明scanf读取字符串,遇到回车结束,舍弃了回车。
hello 回车一块进入输入缓存区,没有读取回车。
再看:
输入一次Hello world
就显示了Hello
world
Hello world 在缓冲区里面
第一个scanf读取hello 遇到空格停止读取,舍弃空格。
第二个scanf读取world。遇到回车结束,舍弃回车。
int main() { char str1[20], str2[20]; gets(str1); printf("%s\n",str1); gets(str2); printf("%s\n",str2); return 0; }
发现可以读取字符串 且接受了空格符。也就是输入什么读什么!!!!
把回车自动转换成字符串的结束\0字符。这样就顺利读入字符串。
如果对scanf读入字符
a和空格
输入缓冲区的数据是a 空格 回车
scanf读取a遇到空格结束
第二个scanf读取空格遇到空格结束
int main()
{
char ch1, ch2,ch3;
scanf("%c", &ch1);
scanf("%c", &ch2);
scanf("%c",&ch3);
printf("%d %d %d\n", ch1, ch2,ch3);
return 0;
}
小结:
scanf getchar读取字符
会读取空格 回车等。
且scanf以空格 回车等结束从缓冲区读取,不会舍弃最后的回车符。
getchar以回车结束,不会舍弃回车符。
读取字符串,
scanf读取字符串,遇到空格结束读取,Hello world!
因为scanf%s只认字符串
gers可以读取空格 和回车 并且自动转换\0,字符串结束符。