一、 字符串简介
1.1 字符串简介
字符串(character string)是一个或者多个字符的序列,如下所示:
" HUAWEI NB!"
双引号不是字符串的一部分。双引号仅告知编译器它括起来的是字符串,正如单引号用于标识单个字符一样。
1.2 char类型数组和null字符
C语言没有专门用于存储字符串的变量类型,字符串都被存储在char类型的数组中。数组由连续的存储单元组成,字符串中的字符被存储在相邻的存储单元中,每个单元存储一个字符。
数组末尾位置的字符 \0,这个是空字符(null character)。C语言用它标记字符串的结束。空字符不是数字0,它是非打印字符,其ASCII码是(或等价于)0。C中的字符串一定以空字符结束,这意味着数组的容量必须至少比待存储字符串中的字符数多去1。那么什么是数组?可以把数组看作是一行连续的多个存储单元。用正式的说法是,数组是同类型数据元素的有序序列。
1.3 使用字符串
/* praise1.c————使用不同类型的字符串 */
#include <stdio.h>
#define PRAISE "You are an extraordinary being."
int main()
{
char name[40];
printf("What's your name?");
scanf("%s",name);
printf("Hello,%s. %s\n",name,RPAISE);
return 0;
}
%s告诉printf()打印一个字符串。%s出现了两次,因为程序要打印两个字符串:一个存储在name数组中;一个由PRAISE来表示。运行praisel1.c,其输出如下所示:
what's your name? Angela Plains
Hello,Angela. You are an extraordinary being.
你不用亲自把空字符放入字符串末尾,scanf()在读取输入时就已完成这项工作。也不用在字符串常量PRAISE末尾添加空字符。稍后解释#define指令,现在先理解PRAISE后面用双引号括起来的文本是一个字符串。
注意(这很重要):scanf()只读取了Angela Plains中的Angela,它在遇到第1个空白(空格、制表符或者换行符)时就不再读取输入。因此,scanf()在读到Angela和Plains之间的空格时就停止了。一般而言,根据%s转换说明,scanf()只会读取字符串中的一个单词,而不是一整句。C语言还有其他的输入函数(如:fgets()),用于读取一般字符串。
1.4 strlen()函数
sizeof运算符,它以字节为单位给出对象的大小。strlen()函数给出字符串中的字符长度。
二、 常量和C预处理器
#define PI 3.14159
使用字符常量的好处:
① 常量名比数字表达的信息更多;② 修改时非常方便,比如税率是经常浮动的,如果程序使用字符常量,则只需要更改符号常量的定义,不用在程序中查找使用常量的地方,然后逐一修改。
2.1 const限定符
C90标准增加了const关键字,用于限定一个变量为只读。其声明如下:
const int MONTHS = 12; //MONTHS在程序中不可修改,值为12
这使得MONTHS成为一个只读值。也就是说,可以在计算中使用MONTHS,可以打印MONTHS,但是不能更改MONTHS的值。const用起来比#define更灵活。(#define是常量,而const声明的是变量)
2.2 明示常量
#define INT_MAX +32767
#define INT_MIN -32768
C头文件 limits.h 和 flost.h 分别提供了与整数类型和浮点类型大小限制相关的详细信息。