详细聊聊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");
}
}
c++中字符串数组怎么定义/
/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;
}
为什么要引⼊缓冲区
⽐如我们从磁盘⾥取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中取数据,等缓冲区的数据取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作⼤⼤快于对磁盘的操作,故应⽤缓冲区可⼤⼤提⾼计算机的运⾏速度。
⼜⽐如,我们使⽤打印机打印⽂档,由于打印机的打印速度相对较慢,我们先把⽂档输出到打印机相应的缓冲区,打印机再⾃⾏逐步打印,这时我们的CPU可以处理别的事情。
现在您基本明⽩了吧,缓冲区就是⼀块内存区,它⽤在输⼊输出设备和CPU之间,⽤来缓存数据。它使得低速的输⼊输出设备和⾼速的CPU能够协调⼯作,避免低速的输⼊输出设备占⽤CPU,解放出CPU,使其能够⾼效率⼯作。
缓冲区的类型
缓冲区分为三种类型:全缓冲、⾏缓冲和不带缓冲。
1) 全缓冲
在这种情况下,当填满标准I/O缓存后才进⾏实际I/O操作。全缓冲的典型代表是对磁盘⽂件的读写。
2) ⾏缓冲
在这种情况下,当在输⼊和输出中遇到换⾏符时,执⾏真正的I/O操作。这时,我们输⼊的字符先存放在缓冲区,等按下回车键换⾏时才进⾏实际的I/O操作。典型代表是标准输⼊(stdin)和标准输出(stdout)。
3) 不带缓冲
也就是不进⾏缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显⽰出来。
总结
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论