关于Scanf和gets函数的讨论

来源:互联网 发布:票务平台知乎 编辑:程序博客网 时间:2024/05/16 11:18

gets()函数用来从标准输入设备(键盘)读取字符串直到回车结束, 但回车符不属于这个字符串。其调用格式为:
     gets(s);
     其中s为字符串变量(字符串数组名或字符串指针)。
     gets(s)函数与scanf("%s", &s)相似, 但不完全相同, 使用scanf("%s", &s)函数输入字符串时存在一个问题, 就是如果输入了空格会认
为输入字符串结束,空格后的字符将作为下一个输入项处理, 但gets() 函数将接收输入的整个字符串直到回车为止。

   char string[15];

   gets(string);        /*遇到回车认为输入结束*/
  
   scanf("%s",string);   /*遇到空格认为输入结束*/

     所以在输入的字符串中包含空格时,应该使用gets输入。

     注意:实际使用scanf()函数时存在一个问题.
1.举例说明:
     当使用多个scanf()函数连续给多个字符变量输入时, 例如:
      main()
      {
           char c1, c2;
           scanf("%c", &c1);
           scanf("%c", &c2);
           printf("c1 is %c, c2 is %c", c1, c2);
      }

2.运行结果:
//////////////////////////////////////////////////////////
h                      //输入h,然后回车
c1 is h, c2 is

Press ENTER to continue.
////////////////////////////////////////////////////////
hi                     //输入hi,然后回车
c1 is h, c2 is i
Press ENTER to continue.

3.结果分析:
     运行该程序, 输入一个字符h后回车 (要完成输入必须回车), 在执行scanf("%c", &c1)时, 给变量c1赋值"h", 但回车符仍然留在缓冲区
内, 执行输入语句scanf("%c", &c2)时, 变量c2输出的是一空行(c2的值为回车字符分ASCII码——0x0a), 如果输入hi后回车, 那么输出结果
为:c1 is h, c2 is i。

4.解决方法:
     要解决以上问题, 可以在输入函数前加入清除函数fflush()。修改以上程序变成:
      #include<stdio.h>
      main()
      {
           char c1, c2;
           scanf("%c", &c1);
           fflush(stdin);    //清除输入缓冲区(清除掉第一次的回车)
           scanf("%c", &c2);
    fflush(stdin);    //清除输入缓冲区(清除掉第二次的回车)
           printf("c1 is %c, c2 is %c", c1, c2);
      }
/////////////////////////////////////////////////////////////////
      运行:
r //输入r,然后回车
t //输入t,然后回车
c1 is r, c2 is t
Press ENTER to continue.

 

原创粉丝点击