C语言输入函数的一些奇怪现象

在谭浩强那本书里面,对于输入函数的解释说明只是一些基本的用法,然而我们在日常使用中,会发生一些奇怪的现象,我们需要用更多的理论知识来解释之。
下面先列举一些奇怪的现象,如果你也出现过这样的现象,并且对其迷惑不解,那么,请继续看下去。

一、奇怪的现象

1. 奇怪现象一:

运行如下代码

#include <stdio.h>

int main() {
	char a;
	scanf_s("%c", &a);
	printf("%d", a);
	return 0;
}

结果:
在这里插入图片描述
我们在输入函数scanf_s("%c", &a);的格式字符串前面加上普通字符空格:scanf_s(" %c", &a);
代码如下:

#include <stdio.h>

int main() {
	char a;
	scanf_s(" %c", &a);
	printf("%d", a);
	return 0;
}

结果如下:
在这里插入图片描述
这里与上面的不同之处在于这里的程序在将输入读取的时候,不能读取到换行符。

2. 奇怪现象二:

运行如下代码:

#include <stdio.h>

int main() {
	int a;
	scanf_s("%d", &a);
	printf("%d", a);
	return 0;
}

结果:
在这里插入图片描述
其实这个应该不觉得有什么奇怪,只是想说明一下为什么。

3. 奇怪现象三:

运行如下代码:

#include <stdio.h>

int main() {
	int a;
	scanf_s(" %d", &a);
	printf("%d", a);
	return 0;
}

结果:
在这里插入图片描述
按照代码中的scanf逻辑,应该要先输入空格,再输入数字的,为什么不用输入空格也可以呢?

二、解释

  1. 对于除开%c的转换说明(也可以理解为格式字符串)外,其它的转换说明(包括%s,实测有效)都是从第一个非空白字符开始读取的。空白字符就是换行、制表和回车符。这就解析了现象三的原因。%d的读取是从第一个非空白字符开始的,而在遇到第一个非空白字符前的所有空白字符都被scanf函数忽略了,因此输不输入空格,结果都是一样的。
  2. 对于现象二,scanf读取的第一个非空白字符是A,但是不符合转换说明,那么scanf在那里会停止读入,结束本次读入,并不会给变量a赋值。至于为什么输出这一串数字,而且似乎输出的数字是一样的,我也不知道为什么,有待探究。
  3. 对于现象一,这是%c转换说明的特殊之处。如果在转换说明前加上空格,那么%c在读取时,会从第一个非空白字符读起。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值