IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 论C/C++中scanf、putchar、gets等输入函数的细微差别 -> 正文阅读

[C++知识库]论C/C++中scanf、putchar、gets等输入函数的细微差别

? 在编程的过程中,我们时常要将输入的值赋给程序。这时候,就需要运用一些函数以实现这一功能。其中,我们最常用的几种函数分别为scanf、putchar,gets。这几种函数的功能类似,但是却略有不同。下面我就来介绍一下这几种函数的异同,以供大家参考。

? 以单词计数程序为例,在这一程序中,我们要统计单词的数量。在第一个程序块中,我们可以看到,这一程序没有输入,要处理的字符串,也就是“i am an sb”提前放到了数组里。在我们运行程序的时候,我们可以发现,输出为4。这也就意味着,字符串中有4个单词。

#include <stdio.h>
#include <ctype.h>

int main() {
	char clast = 'A', s[100] = "i am an sb";
	int count = 0, i = 0;
	while (1) {
		if ((isspace(s[i]) || s[i] == '\0') && isalpha(clast))
			count++;
		if (s[i] == '\0')
			break;
		clast = s[i];
		i++;
	}
	printf("%d", count);
}

显而易见,这一结果是正常的。

? 可是下面就达到了剧情的高潮啦~

? 当我要用scanf输入“i am an sb”这一字符串的时候,输出的结果却是1!!正如下图所见。

#include <stdio.h>
#include <ctype.h>

int main() {
	char clast = 'A', s[100];
	int count = 0, i = 0;
	scanf("%s", s);
	while (1) {
		if ((isspace(s[i]) || s[i] == '\0') && isalpha(clast))
			count++;
		if (s[i] == '\0')
			break;
		clast = s[i];
		i++;
	}
	printf("%d", count);
}

?在这一段代码中,可以看到,我只插入了一行代码—scanf(“%s”,s);可是输出却截然不同!!!

奇了怪了,真的是奇了怪了。。。。

后来,查询了各种书籍之后,才发现scanf在碰到tab、空格、enter之后就会停止读取输入流!!!也就是说,在我输完i,然后敲了空格之后,scanf就已经停止读取输入流中的字符串,程序继续往下进行啦!!!

? 好了,这一问题已经解决喽~

接下来,我们再来看一看getchar()这一神奇的函数。

? 记得我与getchar()初识与《The C Programming Language》(一部由C语言创始人编写的巨作巨作),随后便与之坠入爱河!从此,我便对getchar()爱不释手。

? ?敢爱就要敢付出,既然是真爱,就要为其付出一定的心血!因此,到后来每当我需要用输入函数的时候,我都会用getchar()!

? 但好景不长,刚开始用,我便遇到了极大的麻烦。

? 正如图所示,当我要用getchar()读取“i am an sb”的时候,却。。。。没有。。。。任何输出(内心受到了一万点暴击)

#include <stdio.h>
#include <ctype.h>

int main() {
	char clast = 'A', s[100], c;
	int count = 0, i = 0;
	scanf("%s", s);
	while (1) {
		if (((c = getchar() ) == ' ' || (c = getchar()) == '\0') && isalpha(clast))
			count++;
		if ((c = getchar()) == '\0')
			break;
		clast = c;
		i++;
	}
	printf("%d", count);
}

可是,当我输入“i am an sb”的时候,却没有任何输出!

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 我真心智障了!

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?日日夜夜的调试,换来的却是一无所有!

? 但是我不急不躁,认真地查询一下子getchar()的具体用法,发现我getchar()用得应该没有错。之所以没有输出,主要是因为while()循环没跳出去

? 可是,为什么while循环没有跳出去呢?这是一个问题

? 后来,我才发现getchar()不会将输入的\n自动转化为'\0',也就是说,while循环永远不会跳出。

? 所以,getchar()慎用。。

?

??

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-04 12:40:48  更:2021-10-04 12:42:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 22:18:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码