scanf初学者的进一步知识
一,scanf函数返回值
没错,scanf有返回值。
上代码,发现一下规律
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int m;
int i,j;
printf("输入\n");
m = scanf("%d%d", &i,&j);
printf("输出\n");
printf("%d\n",m);
return 0;
}
scanf返回值就是所输入的数据与格式字符串中匹配次数第一次输入‘1’和‘r’,与’%d’和’%d’只匹配了一次,输出匹配次数1第二次输入’r’和’r’,与’%d’和’%d’一次都没有匹配,输出匹配次数0.
二,小用法
思考一下,如果我做一个进行加法的小程序,让用户输入两个数字。用scanf(“%d%d”,&a,&b)实现输入,但是如果用户输入了,字符,标点符号这些不是数字的东西应该怎么办呢?
下面代码实现,提醒用户非法输入的作用。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
int c = 0;
int m = 0;
do
{
printf("请分别输入a,b\n");
m = scanf("%d%d", &a, &b);
while (getchar() != '\n');
} while (m != 2 && printf("在乱输入什么啊,重新来\n"));
c = a + b;
printf("%d", c);
}
解释一下。
while (getchar() != '\n');
由于没有输入整数,所以,会有字符串或者标点符号这些留在滞留区,这一步是消除他们。
while (m != 2 && printf("在乱输入什么啊,重新来\n"));
为什么printf函数可以放在逻辑运算符后面??printf有返回值哦。具体请看这篇博客
printf返回值博客链接
只要没有老老实实输入两个整数,返回值就不是2,就会一直循环,每一次循环还会打印“在乱输入什么啊,重新来\n”
三,getchar()停不下来??
这个小技巧可能很多人都用,就是通过getchar()来让程序暂停一会。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char arr[20];
scanf("%s", arr);
getchar();
}
但是,结果就是,当你输入了一串字符串之后,程序立刻结束了。为什么呢?涉及到C语言原理的知识了。我们想一想,一串字符串,编译器怎么知道哪里是字符串的结束呢。
1.加一个整形参数记录字符串长度
2.通过特定字符标识字符串的结束。
C语言采用第二种,通过’\n’标识字符串的结束。也就是我们敲的回车。于是乎,我们输入abc,实际上在滞留区保存了abc\n,\n就是最后的回车。scanf只输入了abc。\n依然在滞留区,所以getchar就把\n输入。然后程序就结束了。
解决办法:两个getchar()。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char arr[20];
scanf("%s", arr);
getchar();
getchar();
}