• printf与scanf的返回值、注意点


    1. printf()的返回值为其输出字符串常量的字符数(注意字符数与字数的区别)注意计数针对所有的打印字符,包括空格和不可见的换行字符(不包括字符串的空字符)。
    2. scanf()函数返回成功读入的项目的个数。即在下面程序中scanf的返回值为1。如果没有读取任何项目(如它期望一个数字但是出入了一个非数字字符),它会返回值0。当它检测到“文件结尾”时,它返回EOF(EOF是文件stdio.h中定义的特殊值。一般,#define 指令把EOF 的值定义为 -1)。    int n;
        float  p;
        n= scanf("%f",&p);
        printf("%d,%f",n,p);
    用%c读入空格和字符的问题。
    如果在格式字符串中%c之前有一个空格,那么scanf()会跳到第一个非空白字符处。也就是说,命令scanf(“%c”,&ch)读取在输入中遇到的第一个字符,而scanf(“ %c”,&ch)(%c前有个空格)则读取遇到的第一个非空白字符。
         对于同时输入几个字符,如果逗号(或任何非空格字符)和第一个%c之间没有间隔,则输入时,第一个字符与逗号之间也不能有间隔;如果有空格,则输入时,第一个字符和逗号之间可以有任意多个字符,也可以是0个。如果逗号和第二个%c之间没有间隔,则逗号和第二个输入字符间也不能有间隔。如果有空格,则输入时,第二个字符和逗号之间可以有任意多个字符,也可以是0个。

    printf()函数的*修饰符(*滞后赋值,例:%*d)

     
      假定不想事先制定字段宽度,而是希望由程序来指定该值,可以在字段宽度部分使用*来代替数字来达到目的,但是也必须使用一个参数来告诉函数字段宽度应该是什么。也就是说,如果转换说明符是%*d ,那么参数列表中应该包括一个 * 值和一个 d 的值。同时这种方式也可以和浮点数一起使用来指定精度和字段宽度。
    例:
            printf("What field width? ");
            scanf("%d", &width);
            printf("The number is: %*d: ", width, num);
            printf("Enter a width and a precision: ");
            scanf("%d %d", &width, &precision);
            printf("Weight = %*.*f ", width, precision, weight);
    结果:
    What field width?
    7
    The number is:     256:
    Enter a width and a precision:
    3 7
    Weight = 123.4500000
     

      scanf()函数的*修饰符

     
      在scanf()函数中,当把 * 放在 % 和说明符字母之间时,它使函数跳过相应的输入项目。 
    例:
    int i,j;
        scanf("%d%*d%d",&i,&j);
        printf("%d,%d ",i,j);
    输出结果为:
    2 3 5
    i=2,j=5
    /*
         通过while循环把上面 i 输入后的多的垃圾字符跳过
         如果没有while循环,在调试时输入 i = 123asdfg
         在Vc++6.0中的输出结果为:
         123asdfg
         i = 123
         j = -858993460

         */
        int scan1,scan2;
        char ch;
        scanf("%d", &scan1);
        printf("scan1= %d ", scan1);
        while ( (ch=getchar()) != ' ')
            continue
    ;
        scanf("%d", &scan2);
        printf("scan2 = %d ", scan2);
    参数传递的原理
     
    float n1 = 3.0;
    double n2 = 3.0;
    long n3 = 2000000000; 
    long n4 = 1234567890;  
    printf("%ld, %ld, %ld, %ld ", n1, n2, n3, n4);
    结果为:
    2000000000, 1234567890, 3, 64

      该调用告诉计算机把变量n1、n2、n3、n4的值传递给计算机,计算机把它们放置到被称为堆栈(stack)的一块内存区域中来实现。计算机根据变量的类型而非转换说明符把这些值放到堆栈中。所以,n1 在堆栈中占用8个字节(float 被转换成 double)。同样,n2 也占用8个字节,而n3 和n4 则分别占用4个字节。然后控制转移到 printf()函数。该函数从堆栈把值读出来,但是在读出时,它根据转换说明符去读。 %ld 说明符指出, printf() 应该读取4个字节,所以 printf()在堆栈中读取前4个字节作为它的第一个值。这就是n1的前半部分,它被解释成一个长整数。下一个 %ld说明符再读取4个字节,这就是n1 的后半部分,它被解释成第二个长整数。同样,%ld 的第三个和第四个实例使得 n2 的前半部分和后半部分被读出,并被解释成2个长整数。 

  • 相关阅读:
    我的书单
    说说IUnitOfWork~Linq to Sql与EntityFrameworks中的SubmtChanges()发生了什么事
    说说IUnitOfWork~认识IUnitOfWork,为什么要出现IUnitOfWork接口
    LINQtoSQL那点事~关于延时加载的性能,微软给出了不错的解决方案
    数据结构~站点地图其实是一颗树
    说说IUnitOfWork~方法完整性与统一提交不冲突
    递归 解剖
    Java Socket一对一聊天
    转:浅谈c++容器
    Java JList 使用
  • 原文地址:https://www.cnblogs.com/Alling/p/3971092.html
Copyright © 2020-2023  润新知