strlen()和sizeof()
strlen()和sizeof()都是c中重要的函数,前者能计算字符串数据类型或者特定量的字符长度,而sizeof()能计算数据类型或特定量的大小,即所用储存单元数量。听起来很相似,但是一个特定量所占储存单元大小有时候都是和其字符长度不同的。例如,定义一个char类型字符串a[5]=wow,其sizeof(a)得出结果为5,而strlen(a)结果为3(strlen忽略char字符串末尾的null字符)。这是因为sizeof()将a未用到的储存空间也计算在内了。需要注意的是在使用strlen()函数前需要包含string.h头文件。对于输出时的转义字符,这两个函数的返回值都为unsigned long 或者unsigned,所以需使用%lu或者%u,但是在新的标准中(如c99),为这两个函数专门定义了一个特殊转换说明%zd,所以不论使用哪一种都是可行的。
明示常量
一般常量在函数主体中声明就可以了,且其值是在程序运行中被赋予的。明示常量则不然,其定义方式是在c预处理器中将定义的常量与其值进行一个替换,例如#define x 110,#调用预处理器在编译程序时将所有x的值替换为110,在最终执行代码时,所有替换就已完成。
在头文件limits.h和float.h中,定义了一系列明示常量,如下:
CHAR_BIT 其值代表char数据类型所占位数
CHAR_MAX 其值代表char数据类型所能表示最大值
CHAR_MIN 其值代表char数据所能表示最小值
FLT_MANT_DIG float类型的尾数位数
FLT_DIG float类型的最少有效数字位数(10进制)
FLT_MIN_10_EXP 带全部有效数字的float类型的最小负指数(以10为底)
FLT_MAX_10_EXP float类型的最大正指数(以10为底)
FLT_MIN保留全部精度的float类型最小正数
FLT_MAXfloat类型最大正数
FLT_EPSILON 1.00和比1.00大的最小float类型值之间的差值
相似的还有,
SCHAR_MAX
SCHAR_MIN
UCHAR_MAX
SHRT_MAX
SHRT_MIN
INT_MAX
INT_MIN
UINT_MAX
LONG_MAX
LONG_MIN
ULONG_MAX
LLONG_MAX
LLONG_MIN
ULLONG_MAX
printf()
输出函数,主要转换说明中有几个说明记得不是很清楚
%i 十进制整数,等价于%d
%G或%g根据情况自动选择%f或%E(%e),用于指数小于-4或者>=精度时
然后转换修饰符中,也有几个记得不是很牢,
空格,如% d,如果输出数据为正,则数据前无任何符号(用空格代替),如数据为负,则带有负号前缀
0,如%010d,如果为数值,输出0代替空格填充字面宽度,对于整数,如有指定宽度(*)或-,忽略此修饰符
例如举个例吧,
#include<stdio.h>
int main (void)
{
int a=12100;
printf(“%010d",a);
return 0;
}
输出的是0000012100而非 12100(前面空了5位)
#,除了能转换输出格式为0或0x前缀外,对于浮点数据,保留最后小数点(即使无小数位),对于%g(%G),保留之后的0
.数字,对于%g,表示有效数字最大位数;对于%s,表示待打印字符最大数量;对于整形,表示待打印数字的最小位数(不足用0补充)
hh,和整形转换说明一起使用,表示signed char或unsigned char
j,和整形转换说明使用,表示intmax_t和uintmax_t 类型的值,这些类型定义在stdint.h中
L,和浮点转换说明一起使用,表示long double
t,和整形转换说明一起使用,表示ptrdiff_t的类型的值(两个指针差值)
*,自定义字面宽度或精度,和整形转换说明和浮点转换说明一起使用,如,%*d,%5.*f
scanf()
转换符不说了,返回值在成功读取情况下返回成功读取项数,(空白格如回车制表等自动跳过,遇非数字字符非数字字符认为为结尾,放回输入直到下次读取数据。如读取类型与类型不符返回0。读到结尾返回EOF。(而printf函数返回值为字符个数,包括空格。
修饰符也差不多,主要是*,在此表示跳过,例如,
#include<stdio.h>
int main (void)
{
int a;
scanf("%d%*d",&a);
return 0;
}
假如输入值为 1和2,程序只会读如2,因为*表示跳过此项不读入。