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语言中缓冲区问题

目录

例题

问题原因

解决方法一:

解决方法二:

解决方案三:

出错二

gets函数引入


你是不是总会出现当你输入的时候(你想的是只输出一个内容),但是最后却输入两个。

比如下面这个例子

?那这到底是是哪出了问题呢?

没错这就是关于缓冲区的问题。

我们先仔细了解这个题目

例题

判断字母是否为元音字母包括大小写。

看代码实现(错误的)

#include<stdio.h>
int main()
{
	int i = 0;
	char ch = 0;
	char yyzm[20] = { 'a','A','e','E','i','I','o','O','u','U' };
	while(scanf("%c", &ch)!=EOF)
	{
		for (i = 0; i < 10; i++)
		{
			if (ch == yyzm[i])
			{
				printf("元音字母\n");
				break;
			}
		}
		if (i == 10)
		{
			printf("辅音字母\n");
		}
	}
	
	return 0;
}

问题原因

我们一般怎么输入呢?

我们先输入元音字母o然后在按一下回车,一般输入都是这样输入的到底是哪出了问题呢?

没错就是那个回车惹的祸。每当我们输入一个字母的时候,scanf读取字母之后,就会放入缓冲区中,回车一下当然也会放个'\n'字符也就是空格,当计算机拿取字符的时候先拿走一个字符,接着看里面还有没有字符,如果有字符就会继续读取,如果没有则进行下面的内容。

在我们这个代中由于是多次输入数据,就会读入字符后第一个if语句结束,如果还有字符的话,计算机就会继续拿字符,这时就拿了一个'\n','\n'不是元音字母就会进入下一个if语句输出。

那我们如何解决呢?

解决方法一:

在后面加入getchar(),它的作用就是清理缓存区,由于输入字符,计算机是一个一个字符读取的,又因为我们多次输入,所以getchar总是会读取那个'\n';

解决方法二:

我们在scanf%c后面加个'\n',由于是一个一个读取字符的,如果后面有'\n',就会把\n也拿走。

解决方案三:

在%c前面加个空格,这样做的目的是每次读取下一个字符时,就会把上一个字符后面的'\n'清理掉。

正确的代码:

#include<stdio.h>
int main()
{
	int i = 0;
	char ch = 0;
	char yyzm[20] = { 'a','A','e','E','i','I','o','O','u','U' };
	while(scanf(" %c", &ch)!=EOF)//可以在%c后面加个'\n',也可以在%c前面加个空格,目的是清理缓冲区
	{
		for (i = 0; i < 10; i++)
		{
			if (ch == yyzm[i])
			{
				printf("元音字母\n");
				break;
			}
		}
		if (i == 10)
		{
			printf("辅音字母\n");
		}
	}
	//getchar();清理缓冲区
	return 0;
}

出错二

当我们用scanf输入字符串的时候,如果遇到空格也会出现问题,这时我们就可以引入另外一个函数那就是gets函数

gets函数引入

gets函数的优点与scanf对比:

gets() 函数不仅比 scanf 简洁,而且,就算输入的字符串中有空格也可以直接输入,不用像 scanf 那样要定义多个字符数组。

关于使用 gets() 函数需要注意:使用 gets() 时,系统会将最后“敲”的换行符从缓冲区中取出来,然后丢弃,所以缓冲区中不会遗留换行符。这就意味着,如果前面使用过 gets(),而后面又要从键盘给字符变量赋值的话就不需要吸收回车清空缓冲区了,因为缓冲区的回车已经被 gets() 取出来扔掉了。(此段话是在网上查到的,整理为复习准备,请见谅)。

我们来做个题吧

逆序字符串

#include<stdio.h>
#include<string.h>
void swap(char* str)
{
?? ?int i = 0;
?? ?int len = strlen(str);
?? ?for (i = 0; i < len / 2; i++)
?? ?{
?? ??? ?char tmp = 0;
?? ??? ?tmp = str[i];
?? ??? ?str[i] = str[len - i - 1];
?? ??? ?str[len - i - 1] = tmp;
?? ?}
?? ?printf("%s", str);
}
int main()
{
?? ?//逆序字符串的内容
?? ?char str[100];
?? ?int i = 0;
?? ?gets(str);
?? ?swap(str);

?? ?return 0;
}

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-11-22 12:35:49  更:2021-11-22 12:37:06 
 
开发: 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年11日历 -2024/11/26 12:30:52-

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