七.getchar 和 scanf

本文详细介绍了C语言中getchar和scanf函数用于字符和字符串输入的区别。getchar逐个读取字符,包括换行符,并且在缓冲区中处理。而scanf可以跳过空白字符并读取字符串直到遇到空白。同时,文章提到了gets函数的安全问题以及数组越界的风险,并讨论了两者的优缺点。在使用时应注意避免因换行导致的输入错误。
摘要由CSDN通过智能技术生成

目录

准备

1.getchar函数

1.1特点:

1.2getchar在缓存区接收字符

代码

显示

原因:

2.scanf

2.1读入字符

代码

显示

2.2读字符串 

代码

显示

 原因

3.扩展

3.1gets()函数

3.2数组越界

4.对比

4.1getchar优点

4.2scanf优点 

5.注意


准备

  1. 空白字符:空格符、换行符(\n)
  2. 转换说明:%d、%s、%c等

1.getchar函数

C语言提供的一种输入单个字符的方法

1.1特点:

  •  每次调用getchar函数时,它会读入一个字符并将其返回,必须使用赋值(=)操作将其存储到变量中。
  • getchar返回的为接收字符的ASCII码值,返回一个int类型而不是char

我们使用证明代码如下:

输入的是4,而a显示的值却是52,查看上面的ASCII码表,4对于的ASCII码值为52。所以使用getchar变量得到的是对应字符的ASCII码值。

1.2getchar在缓存区接收字符

代码

int main()
{
	int a = 0;
	while ((a = getchar()) != EOF)
	{
		printf("%c\n", a);
	}

	return 0;
}

显示

 其中字符a和c之间有三行空白。

原因:

首先,在键盘中输入字符是存储到内存缓冲区,getchar函数一次只能接收一个字符。

我们是先输入a后又进行了换行操作时'\n'也被输入,此时变量a被赋值为字符'a'的ASCII码值,缓冲区中还有'\n',在循环内使用printf输出了字符'a',之后printf内的换行符进入第一个空格。

第一轮循环结束后,getchar在缓存区内取出'\n',之后printf再次输出两个换行符,一个是变量a内的一个是printf后的,共三个换行,三行空白。

2.scanf

转换说明%c允许scanf函数对单个字符进行行读(可对如何字符读取)

转换说明%s允许scanf函数把字符串读入字符数组

2.1读入字符

代码

int main()
{
	char a = 0;
	while (scanf(" %c", &a) != EOF)
	{
		printf("%c\n", a);
	}

	return 0;
}

使用scanf函数接收字符时,也存在接收空白字符的情况,

为了强制使scanf函数在读入字符前跳过空白字符,需要在格式串中的转换说明%c前加上一个空格

显示

2.2读字符串 

代码

int main()
{
	char a[10] = { 0 };
	scanf("%s", a);
	printf("%s\n", a);

	return 0;
}

显示

 原因

scanf函数会跳过空白字符,然后读入字符并且存储到数组中,直到遇到空白字符为止,scanf函数读入字符串永远不会包含空白字符。

因此,scanf函数通常不会读入一整行输入。

3.扩展

3.1gets()函数

  1. 因为安全方面的原因,从C11起被废除了
  2. gets函数不会再开始读字符串之前跳过空白字符(scanf会跳过)
  3. gets函数会持续读入,直到找到换行符才停止(scanf函数会在任意空白字符处停止)
  4. gets函数会忽略换行符,不会把它存储到数组中,并用空字符('\0')代替换行符

3.2数组越界

把字符读入数组时,scanf函数和gets函数都无法检测数组合适被填满。当数组越界时,会导致未定义的行为。

可以使用%ns代替%s,数字n指出可以存储的最多字符数。

4.对比

4.1getchar优点

  • getchar函数比scanf函数的执行速度更快

原因:

  1. scanf函数是设计用来按不同的格式读不同类型数据的,getchar比scanf要简单的多
  2. 为了额外的速度提升,通常getchar函数是作为宏来实现的

4.2scanf优点 

  • 相对与getchar可以更方便写入字符串
  • 可以改变转换说明读取输入个类型的数据

5.注意

在换行后使用getchar和scanf("%c")都是危险的动作,会造成数组或变量在读取数据时的失败。

千万小心。

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榶曲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值