美文网首页
scanf函数

scanf函数

作者: silasjs | 来源:发表于2019-01-28 17:22 被阅读0次

    必须用&告诉scanf函数变量的详细地址,才能存储用户输入的数据

    int num;
    scanf("%i", &num);
    printf("num = %i\n", num);
    

    1. 利用scanf接收多个数据的时候,输入的内容要求和格式化字符串中的一模一样
    2. 如果输入的数据与格式化字符串中的不匹配,那么scanf函数会自动终止
    int n1, n2;
    scanf("%i,%i", &n1, &n2);
    printf("n1 = %i, n2 = %i\n", n1, n2);
    
    控制台:
    1,2
    n1 = 1, n2 = 2
    (内容和格式化字符串中一样)
    
    1 2
    n1 = 1, n2 = 0
    (内容不匹配格式化字符串)
    
    1. 如果多个数据之间没有其他分隔符,在控制台输入的时候可以用空格、回车、Tab来作为分隔符

    2. 如果在输入时,输入了多个空格、回车、Tab的话都会被系统忽略,没有影响的。

    int n1, n2;
    scanf("%i%i", &n1, &n2);
    printf("n1 = %i, n2 = %i\n", n1, n2);
    
    控制台:
    1 2
    n1 = 1, n2 = 2
    (空格作为分隔符)
    
    1
    2
    n1 = 1, n2 = 2
    (换行作为分隔符)
    
    1   2
    n1 = 1, n2 = 2
    (Tab作为分隔符)
    
    1. 但是,如果格式化字符串中有%c除外。因为空格、回车、Tab都会被当做字符处理
    int n1, n2;
    char cv;
    scanf("%i%c%i", &n1, &cv, &n2);
    printf("n1 = %i, cv = %c, n2 = %i\n", n1, cv, n2);
    
    控制台:(空格作为分隔符)
    1 a 2
    n1 = 1, cv =  , n2 = 0
    
    1. so,只要连续接收多个数据,格式化字符串中间最好用固定的分隔符(例如:,或者 - )

    2. scanf函数中格式化字符串末尾不能是\n,因为\n是scanf的结束符。如果末尾是\n的话,只能原样输入“\n”或者输入一个不匹配的字符。

    int n1, n2;
    scanf("%i%i\n", &n1, &n2);
    printf("n1 = %i, n2 = %i\n", n1, n2);
    
    控制台:    
    123
    123
    
    \n
    n1 = 123, n2 = 123
    
    1. scanf的实现原理
    • scanf是阻塞线程的,当它接收数据时,数据是从输入设备接收后保存在输入缓冲区的。
    • 当最后接收到\n结束符时,scanf逐个从输入缓冲区获取可以匹配的数据,如果不匹配就会自动结束,并且不会修改对应变量的值,也不会取走输入缓冲区的数据。
    • 如果在输入前,输入缓冲区已有数据,在结束时仍然会从头开始获取数据。
    int n1, n2;
    char c1;
    scanf("%i%c%i", &n1, &c1, &n2);
    printf("n1 = %i, c1 = %c, n2 = %i\n", n1, c1, n2);
        
    char c2;
    int n3;
    scanf("%c%i", &c2, &n3);
    printf("c2 = %c, n3 = %i\n", c2, n3);
    
    控制台:(回车结束符在第一行尾)
    12 + 34
    n1 = 12, c1 =  , n2 = 0
    c2 = +, n3 = 34
    
    1. 如果需要单独取一个字符,而这个字符又被之前输入的字符堵着位置了,或者说输入缓冲区已经有一个其他的字符存在。那么,为了能避免取错,可以使用getchar();函数从输入缓冲区中获取字符。

    相关文章

      网友评论

          本文标题:scanf函数

          本文链接:https://www.haomeiwen.com/subject/yhtzjqtx.html