CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

小弟初学C语言,被一个小问题快急疯了,不知道我哪里不对,哪个高手指点一下小弟呀,在线等呀~~~

楼主gougoubuku(狗狗不哭)2006-03-08 18:34:36 在 C/C++ / C语言 提问

有一个题目是这样的  
  公司根据员工的等级来发放相应津贴,具体如下:  
  等级                 津贴  
  A                       300  
  B                       250  
  C                       100  
  在月末计算工资.(基本工资和等级由用户输入)  
   
  小弟编的程序是这样的:  
  #include   <stdio.h>  
  void   main()  
  {  
  float   a;  
  char   b;  
  printf("Please   import   basic   wages   ");  
  scanf("%f",&a);  
  printf("Please   import   levels   A,B,C   \n");  
  scanf("%c",&b);  
  switch(b)  
  {  
      case   'A'   :  
      printf("%f",a+300);  
      break;  
              case   'B'   :  
      printf("%f",a+250);  
      break;  
              case   'C'   :  
      printf("%f",a+100);  
      break;  
   
  }  
  }  
   
   
  编译时也没有错,可是运行时结果却是,先让我输入一个数,然而回车后出现一个让我输入A,B,C其中字符的提示,然后程序就自动结束了,根本不让我输入字符  
  谢谢哪个大哥帮我看看,这个程式到底错在哪里了?  
  在线等呀,谢谢了呀~~~ 问题点数:20、回复次数:46Top

1 楼dengyiwolf(七星偃月刀)回复于 2006-03-08 19:10:35 得分 0

#include   <stdio.h>  
  void   main()  
  {  
  float   a;  
  char   b;  
  printf("Please   import   X   and   Y(X,Y):");  
  scanf("%f,%c",&a,&b);  
   
  switch(b)  
  {  
      case   'A'   :  
      printf("%f",a+300);  
      break;  
              case   'B'   :  
      printf("%f",a+250);  
      break;  
              case   'C'   :  
      printf("%f",a+100);  
      break;  
   
  }  
  }  
  Top

2 楼dengyiwolf(七星偃月刀)回复于 2006-03-08 19:12:21 得分 0

没人回答,我来说两句:  
        这也是属于回车问题!  
        回车也算是一个字符Top

3 楼gougoubuku(狗狗不哭)回复于 2006-03-08 19:21:58 得分 0

小弟再问一句呀  
    刚才我写的那个程序,为什么把两个输入的顺序换一下,结果又正常了呢?大哥帮我解释一下好吗?小弟刚刚学C,谢谢了  
  #include   <stdio.h>  
  void   main()  
  {  
  float   a;  
  char   b;  
  printf("Please   import   levels   A,B,C   \n");  
  scanf("%c",&b);  
                    printf("Please   import   basic   wages   ");  
  scanf("%f",&a);  
   
  switch(b)  
  {  
      case   'A'   :  
      printf("%f",a+300);  
      break;  
              case   'B'   :  
      printf("%f",a+250);  
      break;  
              case   'C'   :  
      printf("%f",a+100);  
      break;  
   
  }  
  }  
   
  这样把输入的顺序换了一下,结果又正常了,这是为什么呀?  
  Top

4 楼gougoubuku(狗狗不哭)回复于 2006-03-08 19:27:40 得分 0

还有,刚才大哥说回车也是一个字符,可是我先写的那个程序,当他出现第一个要我输入一个数时,我输了一个数,这时回车确认并不会有什么影响吧,当他出现第二个要我输入字符的提示后,我什么都没有输,程序就自动结束了,并不是我按了回车后他才结束的,谢谢大哥给我讲解一下好吗?在线等呀~~~~~~~~~~`Top

5 楼dengyiwolf(七星偃月刀)回复于 2006-03-08 19:33:20 得分 0

当输入800+enterkey('\n')  
  它认为是一个字符'\n'  
    故直接赋予给b了,故b='\n'  
  所以出现这样的情况  
  Top

6 楼gougoubuku(狗狗不哭)回复于 2006-03-08 19:39:07 得分 0

大哥~~你把我最上面的那个源代码里的,第二个printf里面的那个\n去了,结果还是一样的,不信你可以试试呀,  
  我现在想问的是,为什么我让他先输入字符,再输入数字,他的结果就和大哥刚才写的那个结果一样了呢?  
  我就想知道这个,谢谢大哥了Top

7 楼dengyiwolf(七星偃月刀)回复于 2006-03-08 19:50:55 得分 0

他接收的是一个%f,'\n'与其不匹配,所以就没值赋予给它,故可以再次输入Top

8 楼lvfeng350(吕风)回复于 2006-03-08 19:51:43 得分 0

用C++中:  
  #include   <iostream.h>  
  int   main()  
  {  
  int   BasePay;  
  char   rating;  
  cout<<"请输入员工基本工资:"<<endl;  
  cin>>BasePay;  
  cout<<"请输入员工等级:"<<endl;  
  cin>>rating;  
  switch(rating)  
  {  
  case'A':  
  cout<<"员工实发工资:"<<BasePay+300<<endl;  
  break;  
  case'B':  
  cout<<"员工实发工资:"<<BasePay+250<<endl;  
  break;  
  case'C':  
  cout<<"员工实发工资:"<<BasePay+100<<endl;  
          break;  
  default:  
  cout<<"您输入的员工等级有误!"<<endl;  
  }  
  return   0;  
  }  
  Top

9 楼gougoubuku(狗狗不哭)回复于 2006-03-08 19:57:18 得分 0

大哥们还是没有明白我的意思呀,我不是问这个题目该怎么编程,我是问,我写的这个源代码到底哪里不对了,为什么结果不是我想的,编译都是对的,没有报错,但是就是结果不是我所想的  
  #include   <stdio.h>  
  void   main()  
  {  
  float   a;  
  char   b;  
  printf("Please   import   basic   wages   ");  
  scanf("%f",&a);  
  printf("Please   import   levels   A,B,C   \n");  
  scanf("%c",&b);  
  switch(b)  
  {  
      case   'A'   :  
      printf("%f",a+300);  
      break;  
              case   'B'   :  
      printf("%f",a+250);  
      break;  
              case   'C'   :  
      printf("%f",a+100);  
      break;  
   
  }  
  }  
   
  但是这个程序把两个输入的顺序换一下,就是让他先输入字符.再输入数字.他的结果又正常了,这怎么回事.大家有没有看到这种情况,有没有规定说,要同时输入一个字符和一个数字时,必须先输入字符的说法呀Top

10 楼lvfeng350(吕风)回复于 2006-03-08 20:02:45 得分 0

当你输入工资,按回车时  
  a被赋予工资数,而b被赋予回车!  
  应该是这样吧。。。Top

11 楼gougoubuku(狗狗不哭)回复于 2006-03-08 20:08:24 得分 0

大哥看清楚我的代码,我是让他先输出一个提示,然后再让你输入数字,然后再输出一个提示,然后再让你输入字符,  
  我输完数字回车后,电脑直接输出一个要你输入字府的提示,然后就结束了,电脑不可能跳过  
  printf("Please   import   levels   A,B,C   \n");这一行,只直把回车赋给b吧?Top

12 楼duduhaha(三人行必有我师)回复于 2006-03-08 20:12:32 得分 0

下面这样就行了.  
  #include   <stdio.h>  
  void   main()  
  {  
  float   a;  
  char   b;  
  printf("Please   import   basic   wages   ");  
  scanf("%f",&a);  
                    fflush(stdin);//或者getchar();  
  printf("Please   import   levels   A,B,C   \n");  
  scanf("%c",&b);  
  switch(b)  
  {  
      case   'A'   :  
      printf("%f",a+300);  
      break;  
              case   'B'   :  
      printf("%f",a+250);  
      break;  
              case   'C'   :  
      printf("%f",a+100);  
      break;  
   
  }  
  }  
  看完下面的,你就明白了.  
   
  scanf()函数是所有C语言学习者在学习C语言过程中所遇到的第二个函数(第一个函数是printf(),Brian   W.Kerninghan   &   Dennis   M.Ritchie的“hello,world”程序基本上是所有的C语言学习者第一个范例),所以scanf()函数应当是C学习者能熟练运用的一个函数,但有很多初学者对此函数不能很好的运用,在实际编程中错误使用scanf()函数,导至程序产生某种错误不能正常运行,以至产生“scanf()函数有BUG”,“scanf()函数无用论”等等错误观点。  
          本文结合笔者在编程实践中及论坛上网友所遇到的问题作一释疑,但笔者水平有限(菜鸟级),难免有谬误之处,还望达人指点一二。(Email:knocker.k@126.com)  
          本文分上,下两篇讲述了C语言中的scanf()函数的用法,重点阐述使用scanf()函数过程中出现的常见错误及对策。当然,文中某些解决方法,均可以采用其他函数和方法来更好地解决,但本文仅限讨论scanf()函数本身。  
          上篇,详细介绍了scanf()函数控制串的构成。下篇,用实际例程介绍scanf()函数控制串运用出现的常见错误及对策技巧。  
   
  二、             scanf()函数的控制串  
   
  函数名:   scanf    
  功     能:   执行格式化输入    
  用     法:   int   scanf(char   *format[,argument,...]);  
   
  scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘)   读取输入的信息。可以读入任何固有类型的数据并自动把数值变换成适当的机内格式。  
   
  其调用格式为:             scanf("<格式化字符串>",<地址表>);  
   
  scanf()函数返回成功赋值的数据项数,出错时则返回EOF。  
   
  其控制串由三类字符构成:  
   
  1。格式化说明符;  
  2。空白符;  
  3。非空白符;  
   
   
  (A)                                 格式化说明符  
   
   
  格式字符                       说明  
   
  %a                                   读入一个浮点值(仅C99有效)    
  %A                                   同上  
  %c                                   读入一个字符  
  %d                                   读入十进制整数  
  %i                                   读入十进制,八进制,十六进制整数  
  %o                                   读入八进制整数  
  %x                                   读入十六进制整数  
  %X                                   同上  
  %c                                   读入一个字符  
  %s                                   读入一个字符串  
  %f                                   读入一个浮点数  
  %F                                   同上  
  %e                                   同上  
  %E                                   同上  
  %g                                   同上  
  %G                                   同上  
  %p                                   读入一个指针  
  %u                                   读入一个无符号十进制整数  
  %n                                   至此已读入值的等价字符数  
  %[]                                 扫描字符集合  
  %%                                   读%符号  
                                   
  附加格式说明字符表  
   
  修饰符                                               说明  
   
  L/l   长度修饰符                               输入"长"数据  
  h   长度修饰符                                   输入"短"数据  
  W   整型常数                                       指定输入数据所占宽度  
  *   星号                                               空读一个数据    
  hh,ll同上h,l但仅对C99有效。  
   
   
  (B)                   空白字符    
   
  空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符,空白符可以是space,tab,newline等等,直到第一个非空白符出现为止。  
   
  (C)                 非空白字符    
   
  一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。    
   
   
  注:scanf()控制串知识就介绍到这里(应该比较齐全了^_^),如有遗漏下次补上。下面将结合实际例程,一一阐述.  
   
  三、             scanf()函数的控制串的使用  
   
  例1.  
   
  #include   "stdio.h"    
  int   main(void)    
  {    
      int   a,b,c;    
       
      scanf("%d%d%d",&a,&b,&c);      
      printf("%d,%d,%d\n",a,b,c);      
   
      return   0;  
  }        
   
  运行时按如下方式输入三个值:  
   
  3□4□5 ↙(输入a,b,c的值)  
   
  3,4,5   (printf输出的a,b,c的值)  
   
        (1)   &a、&b、&c中的&是地址运算符,分别获得这三个变量的内存地址。  
        (2)   "%d%d%d"是按十进值格式输入三个数值。输入时,在两个数据之间可以用一个或多个空格、tab键、回车键分隔。  
              以下是合法输入方式:    
              ①   3□□4□□□□5↙  
              ②   3↙  
                    4□5↙  
              ③   3(tab键)4↙  
                    5↙  
   
   
  例2.  
   
  #include   "stdio.h"    
  int   main(void)    
  {    
      int   a,b,c;    
   
      scanf("%d,%d,%d",&a,&b,&c);  
      printf("%d,%d,%d\n",a,b,c);      
   
      return   0;  
  }        
   
  运行时按如下方式输入三个值:  
   
  3,4,5 ↙(输入a,b,c的值)  
   
  或者  
   
  3,□4,□5 ↙(输入a,b,c的值)  
   
  3,□□□4,□5 ↙(输入a,b,c的值)  
  ......  
  都是合法的,但是","一定要跟在数字后面,如:  
  3□,4,□5 ↙就非法了,程序出错。(解决方法与原因后面讲)  
   
  再如:  
   
  1、sacnf()中的变量必须使用地址。  
   
                   int   a,   b;  
  scanf("%d%d",a,b);   //错误  
  scanf("%d%d",&a,&b);    
   
  2、scanf()的格式控制串可以使用其它非空白字符,但在输入时必须输入这些字符。  
   
  例:  
  scanf("%d,%d",&a,&b);    
  输入:   3,4   ↙(逗号与"%d,%d"中的逗号对应)    
  scanf("a=%d,b=%d",&a,&b);    
  输入:   a=3,b=4   ↙("a=","b=",逗号与"%d,%d"中的"a=","b="及逗号对应)  
   
   
  3、在用"%c"输入时,空格和“转义字符”均作为有效字符。  
   
  例:  
  scanf("%c%c%c",&c1,&c2,&c3);    
  输入:a□b□c↙    
  结果:a→c1,□→c2,b→c3   (其余被丢弃)    
   
   
  scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。  
                  ①   遇空格、“回车”、“跳格”键。  
                  ②   遇宽度结束。  
                  ③   遇非法输入。  
   
   
          上篇就写到这里吧,第三小节的例程"抄"自网上的一个教程(原因有二:一,可以少打不少字。二,□↙我不知道怎么打。^_^),并删去其中的错误之处.这里也顺便提醒本文读者一句:凡事要亲力而为,即使是经典的书籍也不免有疏漏之处,所以,用编译器说话是最可靠的,是对是错请编译器告诉你。  
   
   
    在上篇我已经表达了两个观点,这里再重申一次:1。本文仅对scanf()函数控制串运用进行探讨,本文所有例程并不构成编程建议。2。凡事要亲力而为,不同平台不同编译器,可能会有不同结果。本文所有例程均在WIN-TC+windows   Me下调试。Top

13 楼duduhaha(三人行必有我师)回复于 2006-03-08 20:13:34 得分 0

问题二:scanf()函数不能正确接受有空格的字符串?如:   I   love   you!  
   
   
  #include   <stdio.h>  
  int   main()  
  {  
          char   str[80];  
           
          scanf("%s",str);  
          printf("%s",str);  
   
          return   0;  
  }  
   
  输入:I   live   you!  
  输出:I  
   
                scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。  
                  ①   遇空格、“回车”、“跳格”键。  
                  ②   遇宽度结束。  
                  ③   遇非法输入。  
   
  所以,上述程序并不能达到预期目的,scanf()扫描到"I"后面的空格就认为对str的赋值结束,并忽略后面的"love   you!".这里要注意是"love   you!"还在键盘缓冲区(关于这个问题,网上我所见的说法都是如此,但是,我经过调试发现,其实这时缓冲区字符串首尾指针已经相等了,也就是说缓冲区清空了,scanf()函数应该只是扫描stdin流,这个残存信息是在stdin中)。我们改动一下上面的程序来验证一下:  
   
  #include   <stdio.h>  
  int   main()  
  {  
          char   str[80];  
          char   str1[80];  
          char   str2[80];  
           
          scanf("%s",str);/*此处输入:I   love   you!     */  
          printf("%s",str);  
          sleep(5);/*这里等待5秒,告诉你程序运行到什么地方*/  
          scanf("%s",str1);/*这两句无需你再输入,是对键盘盘缓冲区再扫描       */  
          scanf("%s",str2);/*这两句无需你再输入,是对键盘盘缓冲区再扫描         */  
          printf("\n%s",str1);  
          printf("\n%s",str2);  
          return   0;  
  }  
   
  输入:I   love   you!  
  输出:I  
              love  
              you!  
   
  好了,原因知道了,那么scanf()函数能不能完成这个任务?回答是:能!别忘了scanf()函数还有一个   %[]   格式控制符(如果对%[]不了解的请查看本文的上篇),请看下面的程序:  
   
  #include   "stdio.h"  
  int   main()  
  {  
          char   string[50];  
           
            /*scanf("%s",string);不能接收空格符*/  
            scanf("%[^\n]",string);  
            printf("%s\n",string);  
            return   0;  
  }  
   
  问题三:键盘缓冲区残余信息问题  
   
   
  #include   <stdio.h>  
  int   main()  
  {  
          int   a;  
          char   c;  
   
          do  
          {  
                  scanf("%d",&a);  
                  scanf("%c",&c);  
                  printf("a=%d           c=%c\n",a,c);  
                  /*printf("c=%d\n",c);*/  
          }while(c!='N');  
  }  
   
        scanf("%c",&c);这句不能正常接收字符,什么原因呢?我们用printf("c=%d\n",c);将C用int表示出来,启用printf("c=%d\n",c);这一句,看看scanf()函数赋给C到底是什么,结果是   c=10   ,ASCII值为10是什么?换行即\n.对了,我们每击打一下"Enter"键,向键盘缓冲区发去一个“回车”(\r),一个“换行"(\n),在这里\r被scanf()函数处理掉了(姑且这么认为吧^_^),而\n被scanf()函数“错误”地赋给了c.  
   
  解决办法:可以在两个scanf()函数之后加个fflush(stdin);,还有加getch();   getchar();也可以,但是要视具体scanf()语句加那个,这里就不分析了,读者自己去摸索吧。但是加fflush(stdin);不管什么情况都可行。  
   
  函数名:   fflush    
  功     能:   清除一个流    
  用     法:   int   fflush(FILE   *stream);    
   
  #include   <stdio.h>  
  int   main()  
  {  
          int   a;  
          char   c;  
   
          do  
          {  
                  scanf("%d",&a);  
                  fflush(stdin);  
                  scanf("%c",&c);  
                  fflush(stdin);  
                  printf("a=%d           c=%c\n",a,c);  
   
          }while(c!='N');  
  }              
   
  这里再给一个用“空格符”来处理缓冲区残余信息的示例:  
   
  运行出错的程序:  
   
  #include   <stdio.h>  
  int   main()  
  {  
          int   i;  
          char   j;  
          for(i   =   0;i   <   10;i++)  
          {  
                  scanf("%c",&j);/*这里%前没有空格*/  
          }  
  }  
   
  使用了空格控制符后:  
   
  #include   <stdio.h>  
  int   main()  
  {  
          int   i;  
          char   j;  
          for(i   =   0;i   <   10;i++)  
          {  
                  scanf("   %c",&j);/*注意这里%前有个空格*/  
          }  
  }  
   
          可以运行看看两个程序有什么不同。  
   
  问题四       如何处理scanf()函数误输入造成程序死锁或出错?  
   
  #include   <stdio.h>  
  int   main()  
  {  
      int   a,b,c;     /*计算a+b*/  
   
      scanf("%d,%d",&a,&b);  
      c=a+b;  
      printf("%d+%d=%d",a,b,c);  
  }  
   
  如上程序,如果正确输入a,b的值,那么没什么问题,但是,你不能保证使用者每一次都能正确输入,一旦输入了错误的类型,你的程序不是死锁,就是得到一个错误的结果,呵呵,这可能所有人都遇到过的问题吧?  
   
  解决方法:scanf()函数执行成功时的返回值是成功读取的变量数,也就是说,你这个scanf()函数有几个变量,如果scanf()函数全部正常读取,它就返回几。但这里还要注意另一个问题,如果输入了非法数据,键盘缓冲区就可能还个有残余信息问题。  
   
  正确的例程:  
   
  #include   <stdio.h>  
  int   main()  
  {  
      int   a,b,c;     /*计算a+b*/  
   
      while(scanf("%d,%d",&a,&b)!=2)fflush(stdin);  
      c=a+b;  
      printf("%d+%d=%d",a,b,c);  
  }  
   
  Top

14 楼carry_on(Never lose my passion)回复于 2006-03-08 20:35:08 得分 0

长了见识  
  scanf()的问题;  
  Top

15 楼zhanxiang(JackieSky)回复于 2006-03-08 20:53:49 得分 0

#include   <stdio.h>  
  void   main()  
  {  
  float   a;  
  char   b;  
  printf("Please   import   basic   wages   ");  
  scanf("%f",&a);  
   
  fflush(stdin);     ////////////加上这一句,清除缓冲区!  
   
  printf("Please   import   levels   A,B,C   \n");  
  scanf("%c",&b);  
  switch(b)  
  {  
      case   'A'   :  
      printf("%f",a+300);  
      break;  
              case   'B'   :  
      printf("%f",a+250);  
      break;  
              case   'C'   :  
      printf("%f",a+100);  
      break;  
   
  }  
  }  
   
  因为你用scanf接收的内容是放到内存里的一段缓冲区中暂时存放的,  
  当你第二次用scanf接收内容时,缓冲区还没有及时释放,所以系统认为你已经输入了值,  
  所以就直接跳过去了!  
  Top

16 楼wucunfu(因为楼主你吝啬,所以我还是一个三角裤衩!)回复于 2006-03-08 21:08:33 得分 0

好东西Top

17 楼lone_512(圣斗士)回复于 2006-03-08 22:01:33 得分 0

没有清空第一个scanf的输入流;  
  可加入一行:  
  while(getchar()   !=   '\n');                   //清除非法输入流  
  Top

18 楼abillchen(依然)回复于 2006-03-08 23:03:25 得分 0

深入!!Top

19 楼bojianyu()回复于 2006-03-08 23:27:02 得分 0

若先要求输入等级(字符型),输入一个等级后,其符合要求,此时按回车,系统把回车所代表的值给下一个scanf(),而类型不一样,所以系统不接受,也因此你可以再输入一个值给a  
   
  而如果你先输入a(数值型),再输入一个回车,此时系统会把回车的值给下一个scanf(),即给等级,对于系统来说,两个scanf()都已接受了值,所以系统会返回结果,当然结果是错的,呵呵  
   
  总而言之,问题出在两个方面,一、回车也代表值           二、碰巧第二个scanf()要求输入字符,若要求输入其他类型就不会出现这个问题,即只要回车的值不符合下一个scanf()要求输入的类型就行  
   
  不知道有没有听懂,呵呵Top

20 楼Tdxdy(网事如风)回复于 2006-03-08 23:39:23 得分 0

#include   <stdio.h>  
  int main(void)  
  {  
  float a;  
  char   b;  
  for(;;){  
  printf("Please   import   basic   wages:\n");  
  scanf("%f",&a);  
  printf("Please   import   levels   A,B,C:\n");  
  scanf("%c",&b);  
   
  switch(b)  
  {  
      case   'A'   :  
      printf("%f\n",a+300);  
      continue;  
      case   'B'   :  
      printf("%f\n",a+250);  
      continue;  
      case   'C'   :  
      printf("%f\n",a+100);  
      continue;  
   
  }    
  }  
  return 0;  
  }Top

21 楼gougoubuku(狗狗不哭)回复于 2006-03-08 23:56:23 得分 0

没想到一个很简单的小小的程序里面还有这么多的道理,谢谢大家的指点,我明白为什么会出错了~~~真是太谢谢大家了~~Top

22 楼liuminghong(长风)回复于 2006-03-09 08:33:36 得分 0

长了见识  
  scanf()的问题;   谢谢了!Top

23 楼quicksandj2()回复于 2006-03-09 10:45:43 得分 0

markTop

24 楼r_s(星期四)回复于 2006-03-09 11:14:50 得分 0

学习Top

25 楼bbbbcccc()回复于 2006-03-09 11:30:43 得分 0

http://valenhua.go3.icpcn.com/Top

26 楼wumingchenchao(一缕阳光)回复于 2006-03-09 11:32:39 得分 0

想不道一个不起眼的scanf()还有那么多道理。长了见识。Top

27 楼slayer(黑暗圣堂)回复于 2006-03-09 12:35:52 得分 0

长见识了,谢谢!Top

28 楼hotonion(菜鸟怎么变大牛呢?)回复于 2006-03-09 13:43:26 得分 0

真是长见识阿~~   谢谢!Top

29 楼Gaosboy()回复于 2006-03-09 15:30:24 得分 0

要求读入一个   '\n'就行了Top

30 楼pluto03(影舟)回复于 2006-03-09 15:47:55 得分 0

学习,谢谢Top

31 楼sqwng()回复于 2006-03-09 16:13:13 得分 0

深入,学习了,谢谢Top

32 楼sust0000()回复于 2006-03-09 18:43:26 得分 0

学习啊!好贴,长见识了----Top

33 楼minsavage(帆野)回复于 2006-03-09 18:45:24 得分 0

在两句话之间加个  
  getchar();  
  就可以了  
  单步跟踪一下就可以看出问题了  
  将两句话反过来   就可以看出在输入薪水前  
  a已经被赋过值了Top

34 楼wumingchenchao(一缕阳光)回复于 2006-03-09 19:51:44 得分 0

再UPTop

35 楼lao_mage()回复于 2006-03-09 19:52:43 得分 0

加一句system("pause");在结尾的地方Top

36 楼mudada(Gump)回复于 2006-03-09 20:17:08 得分 0

因为scanf的引号中遇到空格字符(例如TAB   空格或者回车)是不读取的,所以当第一个scanf你确定的时候你按回车,这个回车继续保留在缓冲区内,所以你第而个scanf马上就把回车给读进去了,在两个scanf中你可以加上:  
  while(getchar   !=   '\n')  
            continue;  
  或者直接加上fflush();函数,作用是清空缓冲区Top

37 楼yleiou(单刀匹马)回复于 2006-03-09 20:29:03 得分 0

学习Top

38 楼wumingchenchao(一缕阳光)回复于 2006-03-09 20:39:45 得分 0

又来了。呵呵。Top

39 楼blacksheephome(角落)回复于 2006-03-09 22:01:17 得分 0

哇,真的见识了,还有这么多学问的啊!  
   
   
  我也想问下大家,哪本书有这么细的说明啊?谭老师的书没有关于这一点的说明啊.(我刚看完输入输出哪一章)Top

40 楼h3551850(不要爱人)回复于 2006-03-09 22:09:36 得分 0

#include   <stdio.h>  
  void   main()  
  {  
  float   a;  
  char   b;  
  printf("Please   import   basic   wages   ");  
  scanf("%f",&a);  
  getchar();  
  printf("Please   import   levels   A,B,C   \n");  
  scanf("%c",&b);  
  switch(b)  
  {  
      case   'A'   :  
      printf("%f",a+300);  
      break;  
              case   'B'   :  
      printf("%f",a+250);  
      break;  
              case   'C'   :  
      printf("%f",a+100);  
      break;  
   
  }  
  }Top

41 楼foxfab(☆小翼★)回复于 2006-03-09 22:14:10 得分 0

我想问问大家,我在测试的时候发现好象你们所说的缓冲区里面默认的就是"\n"符号,我通过段点求值发现b在VC里面的是一个  
  10’       这样的值,并不管是什么类型的,第2个接受的值就是这样一个符号,请教一下大家是回  
    '            
  车吗     ?Top

42 楼dfkjewyoldfjkleoe()回复于 2006-03-09 22:15:08 得分 0

www.source520.com           免费免注册80G源码书籍下载Top

43 楼zixuan8083(C风破)回复于 2006-03-09 22:33:56 得分 0

长见识了!Top

44 楼hq007()回复于 2006-03-09 22:37:14 得分 0

又重新对c语言的scanf有了一种新的了解Top

45 楼jiangjijun(苦恼人也要笑)回复于 2006-03-09 23:10:19 得分 0

好长时间没写程序了,待我试试Top

46 楼wangmuqq88(挥着翅膀的尼姑)回复于 2006-03-12 00:56:05 得分 0

欢迎加群20641933,欢迎大家共同交流.提高!(不怕不会,就怕不学.)Top

相关问题

  • 小弟初学C语言,写了一个排序程序,请高手指点。
  • 菜鸟,初学C++语言
  • 初学c++,请高手指点一下!
  • 初学V C 高手指点 急
  • 初学C语言用什么书好?
  • C语言初学者郁闷。。。
  • 我是C语言的初学者
  • C语言初学的问题!求救
  • 初学C语言。老师出了几个题,哪位大哥哥帮帮忙。指点一下。小妹在此谢过
  • 我是C语言的初学者 今天遇到一道题目 不知道该怎么写 麻烦指点一下!感谢

关键词

  • 函数
  • 字符
  • 数据
  • 键盘
  • scanf
  • 输入
  • 回车
  • 读入
  • 缓冲区
  • printf

得分解答快速导航

  • 帖主:gougoubuku

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo