1、字符串
字符串是一个或者多个字符的序列,比如:“hello world”,双引号不是字符串的一部分,双引号仅仅是告知编译器它括起来的是字符串。
1.1、char类型数组和nul字符
C语言没有专门用于存储字符串的变量类型,字符串都被存储在char类型的数组中。数组是由连续的存储单元组成,字符串中的字符被存储相邻的存储单元中,每个单元存储一个字符。
h | e | l | l | o | w | o | r | l | d | \0 |
---|
字符串末尾位置的字符是’\0’,这个是空字符,C语言用他标记字符的结束。空字符不是0,是一个非打印字符,它的ASCII码是0。C语言中的字符串一定以空白字符串结束,这意味着数组的容量必须至少比待存储字符串中的字符多1。
数组:数组是同类型数据元素的有序序列。
char name[40];
这是一个字符数组,name后的方括号表明这是一个数组,40表明该数组中的元素数量,如果name中最后的一个字符存储的是’\0’,那name就是一个字符串。
字符串看上去比较复杂,必须县创建一个数组,把字符串中的字符一次放入数组,还要在末尾加上一个’\0’。
1.2、使用字符串
- 打印字符串使用%s转换说明。
- scanf()函数在读取用户输入的字符串时,会在遇到第一个空白(空格制表符或者换行符)时不再继续读取输入,比如用户输入"my name is allen",scanf只会读取到"my",而不会读取到后面,因为遇到第一个空白字符了,scanf()就会认为已经输入完成。
"a"与'a'是不同的,前者是字符串,基本类型char派生类型,后者是字符char类型, 前者实际上是两个字符a和\0,后者只有一个字符a。
1.3、sizeof()运算符和strlen()函数
sizeof()运算符,它以字符为单位给出对象大小。strlen()函数给出字符串中的字符长度。
sizeof()与strlen()在计算字符串大小的时候是一样的吗?
- strlen()得出的是字符串中的字符数,包括空格和标点符号。
- sizeof()运算符得出的数会更大,因为它在计算字符串的时候会把末尾的’\0’也计算在内。
- C99和C11标准专门为sizeof()运算符的返回类型添加了
%zd
转换说明,这个对于strlen()函数同样适用。- sizeof()和strlen()的返回的实际类型为unsigned或者unsigned long。
- sizeof()运算符的圆括号可有可无,运算对象是类型时,圆括号必不可少,对于特定量,可有可无,但是
建议所有情况都使用圆括号。
- strlen()函数的头文件是string.h,需要使用的时候"#include <string.h>"。
2、常量和C预处理器
例如:在计算圆的面积时,S = 3.14 * r * r,这里的3.14表示常量pai,在这种情况的时候使用符号常量
会更好。
==如何创建一个符号常量呢?方法1,就是创建一个变量,将变量的值设置为所需要的值,但是程序可能在无意间更改了这个变量的值。==C语言还提供了更好的方案:使用C预处理器
。定义方式如下:
#define NAME VALUE
在程序编译时,程序中所有的NAME都会被换成VALUE这个值,这个过程叫做编译时替换,在程序运行时,程序中所有都已经一环