C Primer Plus - 笔记

第一、 有关scanf()输入函数的一些总结

1、 scanf函数读取输入时, 如果格式指示符为数字时, 它会从非空白符处开始读起. 如果第一个非空白符是数字, 则一直读取到非数字时停止; 如果第一个非空白符是非数字, 则会把读取的字符放回缓冲区, 跳过这个scanf语句,即使后面有接受字符串的%s控制说明符. 如下面所示的语句: 

scanf("%d %e %s", &num, &price, &str);
如果输入: csf, 一按回车就会跳过这条语句, 所以num, price, str值都是不确定的.

    2、scanf()使用*修饰符时, 代表的是跳过这个输入.用法示例:

scanf("%*d %d", &b),即在运行时输入: 5 6, 则b的值为6. 

又见下面一个例子:

scanf(“%d%*d%d”,&a,&b,&c);
执行该语句,若输入为1? 2? 3<回车>,结果为a=1,b=3,c未赋值,2被跳过。 
    
    3、如果在输入格式字符串中使用scanf函数提供的*,将语句写成:
scanf(“%d%*c%d%*c%d’,&date,&month,&year);就能够从输入数据中读取有
效数据并废弃任何%*c所指定的数据(不将其赋给某个变量)。 
例如: 2014/09/25

    4、%[],这个参数的意义是读入一个字符集合. []是个集合的标志,因此%[]特指读入此集合所限定的那些字符, 比如 %[A-Z] 是输入大写字母,一旦遇到不在此集合的
字符便停止. 如果集合的第一个字符是" ^ ", 这说明读取不在" ^ " 后面集合的字
    符,既遇到" ^ " 后面集合的字符便停止.注意此时读入的字符串是可以含有空格的.
     想输入一个字符串, 遇到 "." 停止,可设计如下:
      scanf("%[^.]", str); 


第二、执行下列语句"printf("read number: %d\n", scanf("%2.2f", &b) );"

    输出为"read number: 0...... 为什么? 如果改为scanf("%f")则能正
    确读取输入.(在用scanf()函数获取输入整数/浮点数/字符串时, 
    指定宽度必须是整数值, 否则会导致读取输入失败. )
    输入不可以指定精度.

第三、strlen函数与sizeof宏的区别
strlen()函数计算字符串长度时, 不计算NULL(\0)在内. sizeof()宏计算字符串
常量的长度时, 会把NULL(\0)计算在内. 如果sizeof()宏的参数是数组, 则直接返回数
组的长度. 如果sizeof()宏的参数是数据类型(除字符串),则返回数据类型占用
的长度. 

第四、 什么叫做"p-"记数法? C99 里16进制浮点数记数法。类似E,但不同。数以0x开头(数字0字母x),然后是16进制浮点数部分,接着是p,后面是以 2为底的阶码。
例如:0xb.1ep5 其中b.1e为浮点数的尾数, p5为2的5次方. 

第五、 printf()使用*修饰符修饰格式说明符时(%*d), 则*代表的是读取的长度, 这个长度由参数给出;
用法示例:printf("%*d", 5, 134), 则表示输入的长度是5, 值是134.
        
第六、尽量保证,在两个相邻顺序点之间同一个变量不可以被修改两次以上或者同时
有读取和修改,否则,就会产生未定义的行为。


第七、一元运算符*和++具有相等的优先级, 但它在结合时是从右向左进行的. *start++就意味着++应用于start, 而不是应用于*start. 也就是说, 是指针自增1, 而不是指针所指向的数据自增1. 

    *++start则是指指针先自增1, 然后再使用其指向的值.
    *(start++)的意义同*start++, 即取出start指向的值后, 指针的值再加一个类型的大小.


第八、 当创建一个指针时, 系统只分配了用来存储指针本身的内存空间, 并不分配用来存储数据的内存空间. 因此在使用指针之前, 必须给它赋予一个已分配的内存空间.



第九、  常量指针与指向常量的指针的区别, 常量数组与指针的区别.
    double * const pc = rates
    const double *pc = rates
    const double * const pc = rates

第十、处理多维数组的函数:
        void somefunction(int pt[][4]);
        void somefunction(int (*pt)[4]);
    一般地, 声明N维数组的指针时, 除了最左边的方括号可以留空之外, 其他都需要指定长度.

第十一、 变长数组: 
        int sum2d (int, int, int ar[*][*]);
        int sum2d (int[rows][cols], int rows, int cols);

第十二、 复合文字:
            创建一个有两个元素的无名数组: (int [2]){10, 20}
            使用一个指针指向无名数组:
                            int *pt1;
                            pt1 = (int [2]) {10, 20};
            
            创建一个二维数组:
                    int (*pt2)[4];

                    pt2 = (int [2][4]) { {1, 2, 3, -9}, {4, 5, 6, -8} };

第十三、有关双精度浮点数的输入说明符的说明

1 printf输出float和double都可以用%f,double还可以用%lf。
2 scanf输入float用%f,double输入用%lf,不能混用。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值