Fork me on GitHub

C++中getchar、scanf等输入

基本定义

getchar

1
2
3
4
5
6
7
8
9
10
11
12
int getchar(void)
{
static char buf[BUFSIZ];
static char* bb=buf;
static int n=0;
if(n==0)
{
n=read(0,buf,BUFSIZ);
bb=buf;
}
return(--n>=0)?(unsigned char)*bb++:EOF;
}

该函数声明在 中。
Reads a character from standard input.

当程序调用getchar时,程序就等着用户按键输入,以回车结束输入。

用户输入的字符存放在键盘缓冲区中(回车也存放在缓冲区中)。 当用户按下回车之后,getchar开始从缓冲区每次读取一个字符。
getchar函数返回值是用户输入字符的ASCII码值,若EOF(End-Of-File)则返回-1,并且将用户输入的字符回显到屏幕。

也就是说:如果缓冲区有数据的话,getchar()方法不用等你手动输入,它会直接读取一个字符。


getch

getch功能基本上与getchar相同。区别在于getch不等待回车,只要用户按一个键,就会立刻返回。
getch返回值也是ASCII码值,出错返回-1。
注意:
getch函数是非缓冲输入函数,即不能用getch来接收缓冲区已存在的字符。

通常getch用于程序调试中,在关键位置显示有关结果以查看,然后用getch函数暂停程序运行,按下任一按键继续程序运行。


getche

与上面两个函数功能类似,都是接收一个字符,返回值同样是ASCII码值。

不同的是,此函数在输入后立刻从控制台读取字符,不以回车为结束标识。


scanf

scanf这个函数比较特别
scanf输入字符串,整型,实型等数据的判断方式都一样,回车,空格,tab键都会被认为是输入的结束。当然字符的话,一个字符就是结束了。

回车、空格等都有对应的ASCII码,所以用scanf输入字符时要小心这些东西被当成字符输进去,而输入字符串和整型、实型等数据时这些都被当成分隔符而不会被输入到字符数组或变量里。

如果scanf输入的不是字符,那么分隔符为回车,空格、tab键时,两个数据之间的分隔符只是起区别两个数据的作用,把分隔好的两个数据分别赋值到各自定义好的变量或数组中去,两个数据之间的分隔符被从缓冲区读出但是不起任何作用,当然最后一个’\n ‘会被留在缓冲区内,除非用getchar();或scanf(“%c”,&c);把它读出来。
回车是一定要有的,不管getchar还是scanf只要是通过缓冲区输入数据的函数都是等待回车键 ‘\n ‘出现才进入缓冲区的。

程序举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <stdio.h>

using namespace std;

int main(int argc)
{
int a, c;
printf("please input a char: \n");
a = getchar();
if (EOF != a) {
printf("aaa == %c \n", a);
}

while ((c = getchar()) != '\n' ) {
if (EOF == a) {
break;
}
printf("ccc == %d \n", c);
}

printf("press any key to continue: \n");
getchar();
//此处 getchar()在这里作用等同于 system("pause");
}

结果为
gethar

Enjoy it ? Donate for it ! 欣赏此文?求鼓励,求支持!
>