本文参考C Primer Plus进行C语言学习
文章目录
- strlen()函数
- sizeof
- 使用数据类型
1.strlen()函数
之前提到的sizeof运算符它以字节为单位给出对象的大小。strlen()函数给出字符串中的字符长度。
#include<stdio.h>
#include<string.h>
#define PRAISE "You are an extraordinary being."
int main(void)
{char name[40];printf("What's your name?");scanf("%s",name);printf("Hello,%s. %s\n",name,PRAISE);printf("Your name of %u letters occupies %u memory cells.\n",strlen(name),sizeof name);printf("The phrase of praise has %u letters ",strlen(PRAISE));printf("and occupies %u memory cells.\n",sizeof PRAISE);return 0;
}
运行结果:
sizeof运算符报告,name数组有40个存储单元。但是,只有前4个单元用来存储Wang,所以strlen()得出的结果是4。name数组的第5个单元储存空字符,strlen()并未将其计入。
对于PRAISE,用 strlen()得出的也是字符串中的字符数(包括空格和标点符号)。然而,sizeof运算符给出的数更大,因为它把字符串末尾不可见的空字符也计算在内。该程序并未明确告诉计算机要给字符串预留多少空间,所以它必须计算双引号内的字符数。
C99 和CI1 标准专门为 sizeof 运算符的返回类型添加了zd转换说明,这对于strlen()同样适用对于早期的C,还要知道sizeof 和 strlen()返回的实际类型(通常是unsigned或unsigned long)。
另外,还要注意一点:上一章的 sizeof 使用了圆括号,但本例没有。圆括号的使用时机否取决于运算对象是类型还是特定量?运算对象是类型时,圆括号必不可少,但是对于特定量,可有可无。也就是说,对于类型,应写成 sizeof(char)或 sizeof(float);对于特定量,可写成 sizeof name或sizeof 6.28。尽管如此,还是建议所有情况下都使用圆括号,如sizeof(6.28)。
使用 strlen()和 sizeof,完全是为了满足读者的好奇心。在实际应用中,strlen()和 sizeof 是非常重要的编程工具。例如,在各种要处理字符串的程序中,strlen()很有用。
2.类型大小(sizeof)
如何知道当前系统指定类型的大小?
#include<stdio.h>
int main(void)
{printf("Type int has a size of %u bytes.\n",sizeof(int));printf("Type char has a size of %u bytes.\n",sizeof(char));printf("Type long has a size of %u bytes.\n",sizeof(long));printf("Type double has a size of %u bytes.\n",sizeof(double));printf("Type long double has a size of %u bytes.\n",sizeof(long double));return 0;
}
sizeof是C语言的内置运算符,以字节为单位给出指定类型的大小。C99和C11提供%zd 转换说明sizeof的返回类型。一些不支持C99和C11的编译器用%u或%1u或代替%zd。
3.使用数据类型
编写程序时,应注意合理选择所需的变量及其类型。通常,用int或float类型表示数字,char类型表示字符。在使用变量之前必须先声明,并选择有意义的变量名。初始化变量应使用与变量类型匹配的常数类型。例如:
int apples= 3; /* 正确 */
int oranges =3.0; /* 不好的形式 */
与Pascal 相比,C在检查类型匹配方面不太严格。C编译器甚至允许二次初始化,但在激活了较高级别警告时,会给出警告。最好不要养成这样的习惯。
把一个类型的数值初始化给不同类型的变量时,编译器会把值转换成与变量匹配的类型,这将导致部
分数据丢失。例如,下面的初始化:
int cost = 12.99; /*用double 类型的值初始化 int 类型的变量*/
float pi = 3.1415926536; /* 用 double 类型的值初始化 float 类型的变量*/
第1个声明,cost的值是12。C编译器把浮点数转换成整数时,会直接丢弃(截断)小数部分,而不进行四舍五入。第2个声明会损失一些精度,因为C只保证了 float 类型前6位的精度。编译器对这样的初始化可能给出警告。读者在编译程序清单3.1时可能就遇到了这种警告。
许多程序员和公司内部都有系统化的命名约定,在变量名中体现其类型。例如,用i_前缀表示int类型,us_前缀表示unsigned short 类型。这样,一眼就能看出来i_smart是int 类型的变量us_versmart 是unsigned short 类型的变量。