最新消息:点击查看大S的省钱秘笈

输入缓冲区与C语言的流问题

编程相关 Slyar 132浏览 0评论

文章作者:姜南(Slyar) 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

今天发现一个问题,已经造成了溢出,需要用到传说中的fflush(stdin);来解决。先看下面的代码:

#include <stdio.h>

int main()
{
char s[10],s1[10],s2[10],s3[10];
scanf("%s",&s);
printf("%s\n",s);
scanf("%s%s%s",&s1,&s2,&s3);
printf("%s %s %s\n",s1,s2,s3);
system("pause");
return 0;
}

程序想达到这样一个目的:两次都输入Slyar is good!,第一次输出Slyar,第二次输出Slyar is good!。但是结果却不是我们期望看到的,而是:

Slyar is good!
Slyar
Slyar is good!
is good! Slyar

其中蓝色是我输入的部分,而红色是程序输出的结果,可以看到第二次程序没有输出Slyar is good!而是输出了is good! Slyar,我们来分析一下。

当我们输入Slyar is good!后,系统会把第一个空白当成结束,也就是输出Slyar,这没错。然后紧接着我们再次输入Slyar is good!,按照一般思维,应该是Slyar给了S1,is给了S2,good!给了S3,但是。。。

你看到的is good! Slyar中的is good!其实是第一次输入Slyar is good!后余留在缓冲区里的那部分!也就是说,当第一次系统截断Slyar以后,剩下的部分就留在了缓冲区,当你第二次输入后,系统就把缓冲区里的is good!分配给了S1和S2。这样,只有第三次输入的Slyar被分配给了S3,所以当我们打印S1、S2、S3时,会出现is good! Slyar

那么怎么解决这个问题呢?这就要用到fflush(stdin);了:stdin是默认的输入流文件,对应输入缓冲,而fflush(stdin);就可以清空整个输入缓冲区,本例中即把缓冲区内的is good!刷掉。所以,我们的代码应该这样写:

#include <stdio.h>

int main()
{
char s[10],s1[10],s2[10],s3[10];
scanf("%s",&s);
printf("%s\n",s);
fflush(stdin);
scanf("%s%s%s",&s1,&s2,&s3);
printf("%s %s %s\n",s1,s2,s3);
system("pause");
return 0;
}

编译运行,没问题!这点需要注意,否则极易造成溢出。

转载请注明:Slyar Home » 输入缓冲区与C语言的流问题

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (10)

  1. @ 没所谓,编译器会优化的
    Slyar5年前 (2011-12-30)回复
  2. 貌似在 scanf()中的那个&是不对的诶,谭浩强的书上说 作为字符数组,数组名本身就是一个地址了。。菜鸟求教。。求解释。。。
    匿名5年前 (2011-12-30)回复
  3. 佩服,有同感
    簸箕6年前 (2010-09-18)回复
  4. 在VS2010中不存在这个现象
    簸箕6年前 (2010-09-18)回复
  5. 吹毛求疵下吧。 scanf("%s",&s); &多余。 另外fflush非标准c函数,跨平台编程少用为妙。
    匿名8年前 (2008-12-19)回复
  6. 恩不错, 不过我不喜欢输入字符串,我比较喜欢一个一个字符输入,那样你的这个程序就很简单了! 程序我就不写了;我很懒的! (*^__^*) 嘻嘻……
    And You8年前 (2008-10-25)回复
  7. 其实就是一个回车的问题,恩。 输入11试试
    felix0218年前 (2008-10-15)回复
  8. 给另一个更典型的例子: int main(){ char a, b; a = getchar(); if(a == '1'){ printf("a = 1\n"); }else{ printf("a != 1\n"); } b = getchar(); if(b == "1"){ printf("b = 1\n"); }else{ printf("b != 1\n"); } }
    felix0218年前 (2008-10-14)回复
    • 呃。。。只读一次?
      Slyar8年前 (2008-10-14)回复
  9. 不错。。学习了
    推背图8年前 (2008-10-14)回复