编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛  
全能 ASP / PHP / ASP.NET 主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
 13 12
发新话题
打印

一个看似没错的程序,却有巨大的毛病!

一个看似没错的程序,却有巨大的毛病!

#include"stdio.h"
void main()
{
char c1,c2,c3,c4,c5,a,b,c,d,e;
printf("****BEGIN****\n");
printf("input 5 number\n");
printf("world One:");
scanf("%c",&c1);
printf("\n");
printf("world Tow:");
scanf("%c",&c2);
printf("\n");
printf("world thre:");
scanf("%c",&c3);
printf("\n");
printf("world fore:");
scanf("%c",&c4);
printf("\n");
printf("world five:");
scanf("%c",&c5);
printf("\n");
a=c1+4;
b=c2+4;
c=c3+4;
d=c4+4;
e=c5+4;
printf("%c%c%c%c%c\n",a,b,c,d,e);
printf("****END*****\n");
}
程序能编译出来!
当程序运行完!一共就输入了三次!
one输入了,tow被直接跳过,thre输入第二次,fore又在一次被跳过,five输入第三次!问题大概出在scanf上面!
从程序上看,没什么错,可是运行了,出错!被跳过的总是输出ASCII第14的符号!那问题是怎么会被跳过了呢?

TOP

我试了,确实有问题。。。

不知道是怎么回事


高手来看看~

TOP

第一个scanf输入后缓冲区有残留,如果只输入一个字符就是'\n'
所以第二个scanf会接着读取缓冲区中的数据
如果缓冲区残留的数据多的话,如输入:ffff
就会跳过5个scanf

要清除缓冲区的数据

#include"stdio.h"
void main()
{
    char ch;
    char c1,c2,c3,c4,c5,a,b,c,d,e;
    printf("****BEGIN****\n");
    printf("input 5 number\n");
    printf("world One:");
    scanf("%c",&c1);
    while((ch = getchar()) != '\n')
        continue;
    printf("\n");
    printf("world Tow:");
    scanf("%c",&c2);
    while((ch = getchar()) != '\n')
        continue;
    printf("\n");
    printf("world thre:");
    scanf("%c",&c3);
    while((ch = getchar()) != '\n')
        continue;
    printf("\n");
    printf("world fore:");
    scanf("%c",&c4);
    while((ch = getchar()) != '\n')
        continue;
    printf("\n");
    printf("world five:");
    scanf("%c",&c5);
    while((ch = getchar()) != '\n')
        continue;
    printf("\n");
    a=c1+4;
    b=c2+4;
    c=c3+4;
    d=c4+4;
    e=c5+4;
    printf("%c%c%c%c%c\n",a,b,c,d,e);
    printf("****END*****\n");
}

[ 本帖最后由 xxwpk007 于 2008-7-13 01:08 编辑 ]

TOP

哦,问题就出在缓冲区上!了解了!谢谢啊!
编程小菜

TOP

巨大的毛病是楼主还在使用void main
为了中国软件工业的未来,有爱心的朋友请不要帮忙代做作业,或者至少是收费服务!如果您不需要钱,或者您不愿收费用于自己,请把收取的钱用于支援山区贫困学生…谢谢大家!

TOP

支持孔明!
  雨水冲不进窗来,在玻璃上痛哭。但它至少奋斗过。

TOP

引用:
卧龙孔明 在 2008-7-13 08:57 的发言:

巨大的毛病是楼主还在使用void main
用int main(void){…return 0…}?


二者有何区别?

TOP

那请问下那使用什么呢?谢谢!
编程小菜

TOP

VC中可以使用fflush函数输入清空流:
int i;
char s;
scanf(“%s”, &s);   
fflush(stdin);      // 舍弃原先多余的字符
scanf(“%d”, &i);

TOP

没有什么区别。。只不过一个是标准的用法。一般Windows/DOS下不会爆什么bug的
MAY 1, 1964 -- The Birth of BASIC
Over 40 years later, it still enables ANYONE to write their own programs.
P.S. 我不是艺术家

TOP

 13 12
发新话题