scanf缓冲区问题


#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    //scanf
    
    BOOL A=128;
    if (A) {
        printf("真--A:%d\n",A);
    }else{
        printf("0--A:%d\n",A);
    }
    printf("%ld",sizeof(A));
    
    bool B=128;
    if (B ) {
        printf("真--B:%d\n",B);
    }else{
        printf("假--B:%d\n",B);
    }
    
//    第二个scanf加空格和不加空格的区别:=====》在scanf()中键入一个空格,可以吸收上一次缓冲区内的回车或空格符,可以把这里的空格的长度无限增大

    printf("输入字符:\n");
    char char1=0,char2=0;
    scanf("%c",&char1);
    scanf("%c",&char2);//第二次scanf的时候,会从buffer中读取字符,而此时就是读取到了上一次的回车符。
    printf("char1=%c char2=%c",char1,char2);
    
    printf("输入字符:\n");
    char char3=0,char4=0;
    scanf("%c",&char3);
    scanf(" %c",&char4);//在第二次scanf中格式符前加上一个空格就可以很轻松的解决上一次遗留在buffer中的空格或者回车,而且长度还是不限制的,这时的空格的作用,就是吸收存在buffer中的回车符和空格符或者Tab符
    printf("char3=%c char4=%c",char3,char4);
    
    
    
    //对于字符串数组和字符串指针变量,由于数组名和指针变量本身就表示地址,所以不用加&
    char string0[3][20]={0};
    printf("Please input some strings:\n");
    for (int i=0; i<3; i++) {
        scanf("%s",string0[i]);
        getchar();
    }
    printf("Input those strings:\t");
    for (int i=0; i<3; i++) {
        printf("%s\t",string0[i]);
    }
    printf("\n");
     
    //在输入字符数据的时候,如果没有非格式字符的输入的话,系统会认为所有输入的均为有效字符,比如:
    char ch0=0,ch1=0,ch2=0;
    scanf("%c%c%c",&ch0,&ch1,&ch2);
    getchar();//这个真的是很重要,下次一定得记住了,scanf在哪就带着getchar()
    printf("%c\t%c\t%c\t",ch0,ch1,ch2);
    //输入a b c则ch0=a,ch1=空格,ch2=b
    scanf("%c %c %c",&ch0,&ch1,&ch2);
    printf(":%c %c %c",ch0,ch1,ch2);
    
//    如何让scanf接受带有空格的字符串
//    要用到%[^\n]

    printf("请输入同学的姓名,输入时姓和名用空格隔开:\n");
    char _names[5][20]={0};
    for (int i=0; i<5; i++) {
        scanf("%[^\n]",_names[i]);
        getchar();
    }
    for (int i=0; i<5; i++) {
        printf("第%d个人的姓名:%s\t",i,_names[i]);
    }
    printf("\n");
//    scanf读取键入的字符的易错点
    char _char0=0;
    char _char1=0;
    printf("输入_char0的值:\n");
    scanf("%c",&_char0);
    getchar();
    printf("_char0读取的值显示出来为:%c\n",_char0);
    printf("输入_char1的值:\n");
    scanf("%c",&_char1);
    getchar();
    printf("_char1读取的值显示出来为:%d\n",_char1);//_char1的ASCII码值为10,对应的字符为'\0',由此可以看出,其实第二个scanf接收的字符是上一次键入的回车符,这就是键盘缓冲区滞留的问题。这个问题要用getchar()来解决。
    //键盘缓冲区是针对对个scanf
    char _char2=0;
    char _char3=0;
    printf("输入_char2的值:\n");
    scanf("%c",&_char2);
    getchar();//getchar()就是可以接收空格或者回车,吸收缓冲区中残留的字符
    printf("_char2读取的值显示出来为:%c\n",_char2);
    printf("输入_char3的值:\n");
    scanf("%c",&_char3);
    printf("_char3读取的值显示出来为:%c\n",_char3);
    
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值