type
date
status
slug
summary
tags
category
password
icon
😀
这里写文章的前言: 要搞清楚系统的每一个细节!

库函数strncpy

函数原型

其中n代表最大复制n个字符串,如果n的大小超出了src字符串的大小,那么该函数不会在dest字符串的最后一位添加终止字符串’\0’,这在某些时候会引起一些错误,需要注意。

格式化输出

与宽度控制和精度控制有关的常量都可以换成变量,方法就是使用一个“*”代替那个常量,然后在后面提供变量给“*”。

格式控制字符串

包括三个要素:
  • 格式字符:由”%”引导,其作用是控制输出字符的格式;
  • 转义字符;
  • 普通字符;

格式字符

引导字符

%

类型字符

  • d:有符号,十进制,整数;
  • u:无符号十进制整数;
  • o:以无符号的八进制整数形式输出,不输出前导符0;
  • x或X:以无符号十六进制整数(小写/大写)输出,不输出前导符;
  • f:以小数形式输出单精度、双精度数,默认输出6位小数;
  • e:科学计数法输出;
  • g:自动选取f或e中输出宽度较小的一种使用,且不输出无意义的0;
  • c:char字符;
  • s:char[n],char*字符串;
  • p:地址;
  • i:有符号十进制整数;

格式修饰符

指定输出数据的位宽

例如:

指定输出数据的大小

  • I:修饰格式字符d、u、o、x时,用于输出long型数据;
  • L:修饰格式字符f、e、g时,用于输出long double型数据;
  • h:修饰格式字符d、o、x时,用于输出short型数据;
例如:

指定小数位数

例如:

指定数据域内对齐方式

  • 默认:向右对其;
  • 加一个“-”:向左对齐:

    宏定义细节

    • #define Conn(x,y) x##y //将x与y连接起来
    • #define ToChar(x) #@x //给x加单引号
    • #define ToString(x) #x //给x加双引号

    C语言中嵌套宏的展开规律

    • 一般宏调用的展开规律是,先展开内层宏参数,再展开外层宏函数,所以展开顺序是由内而外的;
    • 如果宏定义中某个形参前面有#运算符,则调用此宏定义时,不展开该形参对应的实参,而是直接把这个实参变为字符串。
    • 如果宏定义中某个形参前面有#@运算符,则调用此宏定义时,不展开该形参对应的实参,而是直接把这个实参变为字符。
    • 如果宏定义中某个形参前面或者后面有##运算符,则调用此宏定义时,不展开该形参对应的实参,而是将##运算符前后的实参连接到一起形成一个新的符号,注意不是字符串。
    也就是说,如果有#或#@或##,则先对这一层宏进行展开,但总体上遵循由内及外的展开方式。

    C语言中类型转换细节

    • 如果是有符号类型,在向高精度转换时,是有符号扩展;
    • 如果是无符号类型,在向高精度转换时,是无符号扩展;
    比如:
    就是进行的无符号扩展,虽然b是有符号类型。
     
    Vimtmux tutorial