C语言回炉之字符串和格式化输入输出

C语言回炉之字符串和格式化输入输出

  • char[] 和 null
    • 字符串 和 字符
  • define
  • const
  • 明示常量
  • printf转换说明符
  • printf转换修饰符
  • printf转换标记
  • scanf的转换说明符
  • scanf的转换修饰符
  • printf 和scanf的*修饰符
    • printf() 的*修饰符
    • scanf()里边的*修饰符

char[] 和 null

C语言没有专门用于存储字符串的变量类型,字符串都被存储在char类型的数组中,字符串的字符被存储在连续的相邻的存储单元中,每个单元存储一个字符,C语言使用\0(空字符)来标记字符串的结束。空字符不是数字0,它是非打印字符,其ASCII码值是(或等价于)0,C语言的字符串一定以空字符结束,这意味这数组的容量必须比待存储的字符数多1。当我们定义字符串的时候,编译器会在末尾加上空字符

字符串 和 字符

‘x’是一个x字符,“x”是由x字符和\0字符组成的字符串。

define

可以使用#define宏定义"明示常量",常用的定义语法如下:

#define NAME value

编译时,#define宏定义会被编译时替换

const

C90标准新增了const关键字,用于限定一个变量为只读,例如:

const int MONTHS = 12;

明示常量

C语言库的头文件limits.h和float.h分别提供整数类型和浮点数类型大小限制相关的详细信息。每个头文件都定义了一些列供实现使用的明示常量,例如limits.h可能又以下预定义:

#define INT_MAX +32767
#define INT_MIN -32768

如果程序有 #include,则可以直接使用这些明示常量:

printf("Maximum int value on you system = %d \n",INT_MAX);

limits.h中的明示常量

明示常量 含义
CHAR_BIT char类型的位数
CHAR_MAX char类型的最大值
CHAR_MIN char类型的最小值
SCHAR_MAX signed char类型的最大值
SCHAR_MIN signed char类型的最小值
UCHAR_MAX unsigned char类型的最大值
SHRT_MAX short类型的最大值
SHRT_MIN short类型的最小值
USHRT_MAX unsigned shrt类型的最大值
INT_MAX int类型的最大值
INT_MIN int类型的最小值
UINT_MAX unsigned int类型的最大值
LONG_MAX long类型的最大值
LONG_MIN long类型的最小值
ULONG_MAX unsigned long类型的最大值
LLONG_MAX long long类型的最大值
LLONG_MIN long long类型的最小值
ULLONG_MAX unsigned long long类型的最大值

同样的float.h头文件也定义一些明示常量,如FLT_DIG和DBL_DIG和LDBL_DIG,FLT,DBL,LDBL开头分别对应float,double,long double

float.h中的明示常量

明示常量 含义
FLT_MANT_DIG float类型的尾数位数
FLT_DIG float类型的最小有效位数(十进制)
FLT_MIN_10_EXP 带全部有效数字的float类型的最小负数(以10为底)
FLT_MAX_10_EXP float类型的最大正指数(以10为底)
FLT_MIN 保留全部精度的float类型的最小正数
FLT_MAX float类型的最大正数
FLT_EPSILON 1.00和比1.00大的最小float类型值之间的差值

printf转换说明符

转换说明符 意义
%a(%A) 浮点数、十六进制数字和p记数法(C99/C11)
%c 单个字符
%d 有符号十进制整数
%f 浮点数(包括float和doulbe) 十进制记数法
%e(%E) 浮点数指数输出[e-(E-)记数法]
%g(%G) 根据值的不用自动选择%f或%e,%e格式用于指数小于-4或者大于等于精度
%i 有符号十进制整数(与%d相同)
%u 无符号十进制整数
%o 八进制整数
%x(%X) 十六进制整数0f(0F) e.g. 0x1234
%p 指针
%s 字符串
%% 输出字符%

printf转换修饰符

修饰符 意义
标志 五种标志将在后面的表中说明,可以使用零个或者多个标志示例: “%-10d”
digit(s) 字段宽度的最小值。如果字段不能容纳要打印的数或者字符串,系统会使用更宽的字段示例: “%4d”,“%10s”
.digit(s) 精度.对于%e,%E和%f转换,是将要在小数点的右边打印的数字的位数。对于%g和%G转换,是有效数字的最大位数。对于%s转换,是将要打印的字符的最大数目。对于整数转换,是将要打印的数字的最小位数。如果必要,要使用前导0来达到位数。只使用"."表示其后跟随一个0,所以%.f和%.0f相同示例: “%5.2f”表示打印一个浮点数,它的字段宽度为5个字符,小数点后有两个数字
h 和整数转换说明符一起使用,表示一个short int或unsigned short int类型数值。示例: “%hu”, “%hx”, “%6.4hd”
hh 和证书转换说明符一起使用,表示一个signed char或unsigned char类型数值
j 和整数转换说明符一起使用,表示一个intmax_t或uintmax_t值 示例: “%jd”,"%8jx"
l 和整数转换说明符一起使用,表示一个long int或unsigned long int类型值
ll 和整数转换说明符一起使用,表示一个long long int或unsigned long long int类型值(C99) 示例: “%lld”,"%8llu"
L 和浮点数转换说明符一起使用,表示一个long double值 示例: “%Lf”, “%10.4Le”
t 和整数转换说明符一起使用,表示一个ptrdiff_t值(与两个指针之间的差相对应的类型)(C99) 示例: “%td”, “%1ti”
z 和整数转换说明符一起使用,表示一个size_t值(sizeof返回的类型)(C99)示例: “%zd”,"%12zx"

printf转换标记

标志 意义
- 项目左对齐,即,会把项目打印在字段的左侧开始处示例: “%-20s”
+ 有符号的值若为正,则显示带加号的符号;若为负,则显示带减号的符号示例: “%+6.2f”
(空格) 有符号的值若为正,则显示时带前导空格(但是不显示符号);若为负,则带减号符号。+标志会覆盖空格标志示例: “% 6.2f”
# 使用转换说明的可选形式。若为%o格式,则以0开始;若为%x和%Xgeshi ,则以0x或0X开始。对于所有的浮点形式,#保证了即使不跟任何数字,也打印一个小数点字符。对于%g和%G格式,它防止尾随0被删除示例: “%#o”, “%#8.0f”, “%+#10.3E”
0 对于所有的数字格式,用前导零而不是空格填充字段宽度。如果出现-标志或者指定了精度(对于整数)则忽略该标志示例: “%010d”, “%08.3f”,"%02X"

scanf的转换说明符

转换说明符 意义
%c 把输入解释成一个字符
%d 把输入解释成一个有符号十进制整数
%e,%f,%g,%a 把输入解释成一个浮点数
%E,%F,%G,%A 把输入解释成一个浮点数
%i 把输入解释成一个有符号十进制整数
%o 把输入解释成一个有符号八进制整数
%p 把输入解释成一个指针
%s 把输入解释成一个字符串;输入的内容以第一个非空白字符作为开始,并且包含直到下一个空白字符的全部字符
%u 把输入解释成一个无符号十进制整数
%x,%X 把输入解释成一个有符号十六进制整数

scanf的转换修饰符

修饰符 意 义
* 滞后赋值。示例:“%*d”
digit(s) 最大字段宽度;在达到最大字段宽度或者遇到第一个空白字符时(不管哪一个先发生都一样)停止对输入项的读取。示例:“s”
hh 把整数读作signed char 或 unsigned char 。示例:“%hhd”“%hhu”
ll 把整数读作long long或者 unsigned long long (C99)。示例:“%lld”“%llu”
h,l或L “%hd”和“hi”指示该值将会存储在一个short int中。“%ho”“%hx”和“%hu”指示该值将会存储在一个unsigned short int中。“%ld”和“%li”指示该值将会存储在一个long中。“%lo”“%lx”和“%lu”指示该值将会存储在一个unsigned long中。“%le”“%lf”和“%lg”指示该值以double类型存储。将L(而非l)与e、f和g一起使用指示该值以long double类型存储。如果没有这些修饰符,d、i、o和x指示int类型,而e、f和g指示float类型。
j 在整形转换说明后面,表达使用 intmax_t或uintmax_t类型(C99)示例:“jd” “jo”
z 在整形转换说明后面,表明使用sizeof的返回类型 示例:“%zd” “%zo”
t 在整形转换说明后面,表明使用两个指针之间的差值的类型(C99)示例: “%td” “%tx”

printf 和scanf的*修饰符

printf() 和scanf() 都可以使用*修饰符来修饰转换说明的含义。

printf() 的*修饰符

如果事先没有指定字段宽度,想用程序来指定,那么就可以用*修饰符来代替字段宽度,但是需要一个参数告诉函数,字段宽度应该为多少。 即%d,参数应该包含和d的对应的值

#include 
int main()
{
    unsigned width,precision;
    int number=256;
    double weight=242.5;
 
    printf("enter a field width:\n");
    scanf("%d",&width);
    printf("the number is:%*d:\n",width,number);
    printf("now enter a width and precision:\n");
    scanf("%d%d",&width,&precision);
    printf("weight=%*.*f\n",width,precision,weight);
    printf("done!\n");
 
    return 0;

}

scanf()里边的*修饰符

如果把*放在%和转换字符之间,就会跳过相应的输出项。

#include 
int main()
{
    int n;
 
    printf("please enter three integers:\n");
    scanf("%*d %*d %d",&n);
    printf("the last integers was%d\n",n);
 
    return 0;
}

上面的案例就会跳过2各整数,将第三个整数复制给n.

你可能感兴趣的:(C语言)