目录
1.getchar
1.1例子引入
//代码什么意思?
//代码1
#include <stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
putchar(ch);
return 0;
}
运行结果:输入一个字符,按回车以后会在下一行打印输入的字符。
如果想停下来可以按Ctrl+z再按回车。
1.2函数介绍
int getchar(void)
返回值是读取字符的ASCII码,只要是ASCII码表里有的字符它都能读取出来。getchar()返回的内容用更大范围区间的int型接收,可以返回EOF(本质是-1)表示出错,也能使程序更加稳健。
1.3缓冲区
执行getchar()函数,编译器会依次读取缓存区的一个字符(只读取一个字符),而不是直接从键盘输入的来读。如果缓存区没有字符,那么编译器会等待它里面有字符串再执行下一步。
什么是缓冲区?缓冲区 ,内存空间的一部分。 在内存空间中有一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,显然缓冲区是具有一定大小的。. 缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。.我们将数据输入到键盘中,程序不会一个一个操作,而是用户输入回车后把这些数据一次性送入缓冲区中,提高效率。
注意回车也算一个字符,输出时效果直接换行。
所以代码一运行结果是每敲回车后输出字符加换行:
练习
//代码2
#include <stdio.h>
int main()
{
char ch = '\0';
while ((ch = getchar()) != EOF)
{
if (ch < '0'|| ch > '9')
continue;
putchar(ch);
}
return 0;
}
//这个代码的作用是:只打印数字字符,跳过其他字符的
同理,按Ctrl+z也可以停下来。
2.scanf
2.1函数介绍
int scanf(const char * restrict format,...);---->函数原型
scanf("%d %d",&a,&b);----->例子
格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。
参数:
函数的第一个参数是格式字符串,它指定了输入的格式,并按照格式说明符解析输入对应位置的信息并存储于可变参数列表中对应的指针所指位置。每一个指针要求非空,并且与字符串中的格式符一一顺次对应。
返回值:
函数返回值为int型,返回读取的数据个数。如果2个数据被成功读入,那么scanf的返回值就是2;
如果只有一个被成功读入,返回值为1;读取失败,返回值为0;如果遇到错误或遇到end of file,返回值为EOF。end of file为Ctrl+z 或者Ctrl+d。
2.2一一对应与分隔
一一对应:
在 scanf 中,所有的“非输入控制符”都要原样输入,这样才能一一对应。如:
#include<stdio.h>
int main()
{
int a=0;
scanf("a=%d,",&a);
return 0;
}
在输入的时候a=必须要和scanf里面输的一样,必须要输入i=12,才可以给a赋值12,少一个就会出错。
scanf 中%d后面也没有必要加\n, scanf 中\n不会进行换行,还得将回车进行匹配。
分隔:
一次给多个变量赋值:
# include <stdio.h>
int main(void)
{
int i, j;
scanf("%d%d", &i, &j);//1
scanf("%d %d", &i, &j);//2
// scanf("%d,%d", &i, &j); 不建议这样,因为要为了与 , 匹配可能出错
printf("i = %d, j = %d\n", i, j);
return 0;
}
从键盘输入数据时,给多个变量赋的值之间一定要用空格、回车或者 Tab 键(空白字符) (个数随意,原因是下面介绍的scanf吃空白 )隔开,用以区分是给不同变量赋的值。即使是第一种写法也要。如,赋值1和2,不空开会变成i为12。
2.3吃空白
吃空白:
int main()
{
int i = 0;
int j = 0;
scanf("%d ", &i);
scanf("%d ", &j);
printf("%d %d", i, j);
return 0;
}
以上代码运行会发现,i和j的值录入了以后用回车隔开,但是一直没有结束scanf函数也无法打印。 这叫scanf吃空白行为 ,使用scanf连续输入多个回车依旧无效,只能再输入一个数字才可以停下。
scanf("%d ",&j);
这里scanf()默认把空格符作为分割多个输入的标志,所以当你输入2和回车的时候,scanf()会认为你将要进行下一个输入,从而停下来等你输入下一个非空白数据。也就是错当成走到了
scanf("%d %d",&a,&b);这样的中间隔开的位置,还得接收b变量。
scanf()把空格、回车、制表符全都吃掉,默认把空白作为分割多个输入的标志,所以当你输入空白的时候,scanf()会认为他们是分隔符,你将输入下一个数据,而不停下来。这时候只能输入一个非空白字符来让它停下,这个字符没有赋值给任何变量。
scanf("%d",&j);
这种情况,这里的scanf参数字符串的处理已经来到结尾,scanf()不会认为你将继续进行输入,会i停下。
2.4scanf()获取字符
scanf函数也是从键盘缓冲区读走一个字符,与getchar类似,最后的'\n'回车也会储存在键盘缓冲区。
int main()
{
char c = 0;
while (scanf("%c", &c) == 1)
{
getchar();//注意用getchar及时清理回车
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
{
printf("%c is an alphabet.\n", c);
}
else
{
printf("%c is not an alphabet.\n", c);
}
}
return 0;
}
3.gets
3.1函数介绍
gets从标准输入设备读字符串函数,其可以无限读取,不会判断上限,以回车结束读取。
功能:
从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。
注:和它配合使用的puts函数,会在输出字符串的时候自动换行。
调用格式:
gets(s);其中s为字符串变量(字符串数组名或字符串指针)。
3.2与scanf区别
gets(s)函数与scanf("%s",s)相似,但不完全相同,使用scanf("%s",s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。