C/C++ 小知识

今天看别人的博文发现有个人对这个问题很感兴趣

  1. int main()  
  2. {  
  3.     char a,b;  
  4.     printf("please input a: ");  
  5.     scanf("%c",&a);  
  6.     printf("please input b: ");  
  7.     scanf("%c",&b);  
  8.     return 0;  

得不到正确的结果,其实道理很简单,只需要清除缓存就可以了,在windows下很好搞定,只需要

fflush(stdin);

就可以简单达到效果

但是linux下我搞了一会才搞定原来这个函数可以

setbuf(stdin, NULL);

最后给出程序

char a,b;
       printf("please input a character:");
       scanf("%c",&a);
       //flushall();
       setbuf(stdin, NULL);
       printf("please input a character:");
      // fflush(stdin);
       scanf("%c",&b);
       //fflush(stdin);
       printf("the 2 numbers are:%c\t%c\n",a,b);
       getchar();
       return 0;

下面说一说清除缓存的故事

 清空缓冲区的残留数据。

     使用 fflush(stdin); 或 rewind(stdin); 均可起到清空键盘缓冲区的作用,这两个函数均包含在stdio.h这个头文件中

上面的实例只适用于Windows系统,在Linux环境下上面两种写法都是不起作用的,所以还要换个函数。

setbuf(stdin, NULL); /*清空缓冲区*/(Ubuntu + codeblocks)

总结一下:

一. scanf 返回值

      scanf()函数执行成功后的返回值是成功读取的变量数,也就是说,这个scanf()函数有n个变量,如果scanf()函数全部正常读取,它就返回n。scanf()函数执行成功意味着:用户输入的数据类型与scanf()函数的变量类型匹配,且个数一致,如scanf(“%d”, &a);用户输入的是整数6,则scanf()函数执行成功,返回值为1,即scanf("%d", &a) == 1。熟悉这一点,就可以用于验证用户输入的正确性。以下是一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int main ( )
{
    int a = 123 ;

    printf ( "输入一个整数:\n" ) ;
    while (scanf("%d", &a)!=1)  /*输入的是非法值,则要求用户重新输入*/
    {   /*直到用户输入合法值为止*/
        printf ( "错误,重新输入:\n" ) ;
        setbuf (stdin , NULL ) ;     /*清空键盘缓冲区,清楚上次错误输入的数据*/
    }
    printf ( "a = %d" , a ) ;
    return 0 ;
}

运行结果1:

输入一个整数:

6 (回车)

a = 6

运行结果2:

输入一个整数:

k  (回车)

错误,重新输入:

6 (回车)

a = 6

二. 用scanf()输入多个字符串

     一定要注意:用scanf()输入多个字符串时一定要注意分隔符问题。如scanf("%s,%s", p1, p2);如果你输入abcd,efgh   事实上p1等于abcd,efgh而不是abcd,而p2是乱码,这时候scanf("%s,%s", p1, p2);的返回值是 1 ,而不是2。输入多个字符串是,使用用空格、n和t作为分隔符都是正确的,如果你输入的字符串包含空格,则要用gets(),不要用scanf。以下是几个正确的范例:

1
2
3
scanf ( "%s\n%s" , p1 , p2 ) ;   /* 输完p1,然后Enter,接着输入p2 */
scanf ( "%s %s" , p1 , p2 ) ;   /* 输入时用空格隔开 */
scanf ( "%s\t%s" , p1 , p2 ) ;   /* 输入时用Tab隔开 */
三. 清屏函数

     使用system(“CLS”)函数可以清除程序运行窗口中所有内容,即在system(“CLS”)函数之前输出的所有内容都将被删除。这个函数对于命令行的程序的相当有用的(个人观点),可以实现程序界面的简洁性。但是system(“CLS”)函数在Linux平台的GCC中是无法识别的,那就换做system(“clear”),可以实现相同的功能。

四. system("pause")和getchar()

     有时候程序运行只是一闪而过,看不到运行结果,这时system(“pause”)和getchar()就起作用了。system(“pause”)是程序运行到该函数就暂停运行了,按任意键可以继续运行system(“pause”)函数之后的代码,程序暂停的时候,你就可以看到之前的输出结果了;getchar()一般用于获得从键盘输入的字符,如果是单纯的一条语句getchar();就表示等待用户输入字符,这也起到暂停程序运行的功能,跟system(“pause”)的功能大同小异,按任意键后就可以继续运行getchar();之后的代码了。注意:system(“pause”)在Linux平台的GCC中是无法使用。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值