嘉明的C学习之Day4--混合运算scanf读取标准输入原理

字符串型常量

字符串型常量是由一对双引号括起来的字符序列。
例如,“How do you do.”、“CHINA”、 “a"和”$123.45"是合法的字符串型常量,我们可用语句 printf(“How do you do.”)输出 一个字符串。但要注意的是,'a’是字符型常量,而"a"是字符串型常量,二者是不同的。
注意:
1. 如果先用语句 char c 定义字符型变量 c,后令 c="a"或 c=“CHINA”,那么这样的 赋值都是非法的,原因是不可以将字符串型常量赋值给字符型变量。C 语言中没有定义字符串型 变量的关键字,介绍字符数组时我们将详细讲解如何存放字符串。

2. C 语言规定,在每个字符串型常量的结尾加一个字符串结束标志,以便系统据此判断字符串 是否结束。C 语言规定以字符’\0’作为字符串结束标志。
例如:字符串型常量"CHINA"在内存中,它占用的内存单元不是 5 个字符,而是 6 个字符,即大小为 6 字节,最后一个字符为’\0’
然而,在输出时不输出’\0’,因 为’\0’无法显示。
嘉明的C学习之Day4--混合运算scanf读取标准输入原理

混合运算

整型数进行除法运算时,如果运算结果为小数,那么存储浮点数时一定要进行强制类型转换。

#include<stdio.h>
int main() {
	int i = 5;
	float j = i / 2;//这里输出的值是2.0不是2.5
	float k = (float)i / 2;//这里输出的值才是2.5,因为已经把i强制变为了float类型
}

数据输入/输出函数

标准输入:scanf、getchar
标准输出:print、putchar

scanf的原理

int scanf(const char *format,…);
format 是一个字符串,…是可变参数,参数中的数目与format中的%数目需要保持一致。
%d 一个十进制整数
%f 一个浮点数
%c 一个单一字符

scnaf标准输入的缓存原理
下面用以下这段程序来解释以下scanf的缓存原理
在开始前我们需要了解以下几点:
1.标准输入读取数据都是在标准输入缓存区(stdin)读取的
2.但遇到\n时,数据才会被读入(即我们输入一个数字按下回车键后数据才会被读取并赋值给第一个数字)
3.只有标准输入缓存区为空的时候才会进入阻塞状态

#include<stdio.h>
int main() {
	int a;
	char c;
	scanf("%d",&a);
	printf("a=% d\n", a);
	scanf("%c", &c);
	printf("c=%c", c);
	printf("用于检测是否换行");
}

先来展示一下运行结果:
嘉明的C学习之Day4--混合运算scanf读取标准输入原理
可以看到,当我们输入一个10的时候就直接输出结果了
当时这里的话我简直是一个大大的疑问
我不是有两个scanf吗?你怎么指给我输入一次?键盘成精了自动输入内容不成????
然后我就去了解一下,原来是我没有搞懂原理。
我先来大致说一下过程,当我们输入10的时候在进程中标准输入的缓存区就会有一个10 当我们按下回车时就会有一个换行\n字符,这时10就会赋值给a。于是我们前面说的重点来了只有标准输入缓存区为空的时候才会进入阻塞状态但是此时我们的缓存区还有换行符啊,它还是属于一个字符的。我们前面说过遇到\n时(我们按回车时),数据才会被读入。于是\n就顺势赋值给了c这个字符变量。
嘉明的C学习之Day4--混合运算scanf读取标准输入原理
输出结果可以证明
c=之后进行了换行,我输出最后一句话就是为了验证这一点,不是代表内容为空。
嘉明的C学习之Day4--混合运算scanf读取标准输入原理
嘉明的C学习之Day4--混合运算scanf读取标准输入原理
从监视和0内存中我们可以看到c是有值的,且值为10。
因为\n在ASCII中的值就是为10
嘉明的C学习之Day4--混合运算scanf读取标准输入原理
但是!!!!!
又有一个例子,我们把c变为int,且输入类型为%d

#include<stdio.h>
int main() {
	int a;
	int c;
	scanf("%d",&a);
	printf("a=% d\n", a);
	scanf("%d", &c);
	printf("c=%d",c);
	printf("用于检测是否换行");
}

可以看到这时候我们进行了两次输入,就是程序会进行阻塞了。
嘉明的C学习之Day4--混合运算scanf读取标准输入原理
当时我学的时候心中飘过一万个*!!!不是\n还在吗?????为什么还阻塞啊!!!!难道我理解错了???
又经过了一番学习,结果看到了以下这句话:

scanf 函数在读取
整型数(%d)
浮点数(%f)
字符串(%s)
时会忽略’\n’(回车符)、空格符等字符(忽略是指 scanf 函数执行时会首先删除这些字符,然后再阻塞)。
scanf 函数匹配一个字符时,会在缓冲区删除对应的字符。因为在执行 scanf("%c",&c)语句时,不会忽略任何字符,所以 scanf("%c",&c)读取了还在缓冲区中残留的’\n’

看到这段话心里踏实了不少,这C语言真可爱都

小作业判断闰年

#include<stdio.h>
int main() {
	int year;
	scanf("%d", &year);
	if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0)
		printf("yes");
	else
		printf("no");
}

嘉明的C学习之Day4--混合运算scanf读取标准输入原理

上一篇:PHP-2: 显示时间


下一篇:超短的webshell