天天看点

c语言 字符串 按 长度分割_C语言查询要点

1. 数据类型

c语言 字符串 按 长度分割_C语言查询要点
c语言 字符串 按 长度分割_C语言查询要点

2. 转义字符

c语言 字符串 按 长度分割_C语言查询要点

3. 变量

数据类型名 变量名列表

① 标识符是以字母或下划线开头,由字母、数字和下划线组成的字符序列。② 标识符是区分大小写的。③ 不能使用C语言的关键字定义其他的标识符。④ 变量在声明的同时可以给其赋值,称为变量的初始化。

⑤  如果任何时候都不希望改变某个变量的值,可以将该变量声明为固定变量。在定义并初始化该变量时,为其声明加上保留字const。

4.数据类型转换

c语言 字符串 按 长度分割_C语言查询要点

强制类型转换:(数据类型名) (表达式)    将表达式的数据类型转化

5.数据的输出函数

①putchar(整型表达式)     

  字符输出函数,在标准输出设备上输出单个字符。

②printf(“格式控制”,输出表列);

如b=1:printf(“a=%d”,b)

   a为普通字符,d为格式字符,%d为格式说明,a=%d为格式控制,b为输出表列;

   输出为:a=1

还可以表示:printf(参数1,参数2........参数n);

   如:printf(“%d%f%c”,a,b,c);的执行结果为:a按%d的格式输出,b按%f的格式输出,c按%c的格式输出。只有第一个参数“参数1”是必要的,其他参数可以省略。当只有一个参数时,“参数1”中不能包含“格式说明”字符,只能有“普通字符”。

ptintf函数的格式字符:

c语言 字符串 按 长度分割_C语言查询要点

在格式说明中,在引导符“%”和格式字符之间还可以插入附加格式说明字符,以便更精确地控制输出格式;

c语言 字符串 按 长度分割_C语言查询要点

6. 数据的输入函数

①getchar();

从键盘上输入一个字符。通常把输入的字符赋予一个字符变量。

②scanf(格式控制,地址表列)

其中,“格式控制”的含义同printf函数,“地址表列”是由若干个内存地址组成的表列,可以是变量的地址,也可以是字符串的首地址。对于一般变量,出现在scanf函数参数中时,通常需要加地址运算符“&”。但有些参数本身就是地址,也就不需要加地址运算符了,比如用指针变量作为参数。

7.运算符的优先级

c语言 字符串 按 长度分割_C语言查询要点

7. if语句

if(表达式)语句;

先计算条件“表达式”的值,若结果为“真”则执行“语句”,然后执行if语句后面的语句。如果结果为假,则不执行“语句”,而直接执行if语句之后的语句。

if(表达式)语句1;

else语句2;

先计算条件“表达式”的值,如果结果为真则执行“语句1”,否则执行“语句2”,然后跳到整个if语句之外继续执行程序。

if(表达式1)语句1;else if(表达式2)语句2;……else if(表达式n)语句n;

else语句n+1;先计算“表达式1”,如果为“真”,则执行“语句1”,然后跳出if语句,转到if语句后的语句(位于“语句n+1”之后)继续执行程序;若“表达式1”为“假”,则跳过“语句1”,计算“表达式2”;若“表达式2”为“真”,则执行“语句2”,然后跳出if语句,否则再计算“表达式3”,……,以此类推。当“表达式n”为“假”(意味着,所有表达式的值都为“假”)时,执行“语句n+1”。

8. 条件运算和条件运算表达式

表达式e1?表达式e2:表达式e3其中,表达式e1是一个关系表达式或逻辑表达式,结果是逻辑值“真”或“假”。表达式e2、e3可以是任意表达式。先求解表达式e1;若e1为真(非0),则计算表达式e2,并将e2的结果作为整个条件表达式的结果;若e1为假(0),则计算表达式e3,并将e3的结果作为整个条件表达式的结果。

9. switch语句

switch(表达式){case常量表达式1:语句1;case常量表达式2:语句2;……case常量表达式n:语句n;default:语句n+1;}先计算“表达式”的值,并逐个与其后的“常量表达式i”(即常量表达式1、常量表达式2、……、常量表达式n)的值相比较,当“表达式”的值与“常量表达式i”的值相等时,即开始执行该“常量表达式i”后的“语句i”,如果没有遇到break语句,则继续执行后面所有的case后(跳过case部分)的语句,直到遇到break语句或者switch语句最后的“}”。如果“表达式”的值与所有的“常量表达式”均不相同,则执行default后的语句。在switch语句中,常使用break语句来结束switch语句。break语句的格式为:break;

10. While语句

while语句的一般格式为:while(表达式)语句do-while语句的一般格式为:

do语句while(表达式);

① 计算“表达式”的值;② 若“表达式”的值不是0,则为“真”,继续执行③,否则,结束循环,转到while语句后面的语句继续执行程序;③ 执行“语句”部分,即执行循环体;④ 返回①继续执行。

11. for语句

for(表达式1;表达式2;表达式3)语句“表达式1”用于循环的初始化;“表达式2”是for语句的循环控制条件,可以是任何形式的表达式;“表达式3”用于修改循环控制变量的值,目的是使“表达式2”的值变为0,以结束循环;

① 计算“表达式1”;② 计算“表达式2”,如果“表达式2”的值为0(表示“假”),则转到⑤,否则转到③;③ 执行“语句”部分;④ 计算“表达式3”后,转到②;⑤ for语句结束。

12. goto语句

goto语句标号;

13. 数组

一维数组的定义:

类型说明 数组名称[数组长度]

二维数组的定义:

类型说明 数组名称[行数][列数]

三维数组的定义:

类型说明 数组名称[行数][列数][层数]

数组的初始化出:

类型说明 数组名称[数组长度]={数值列表}

不允许定义可变长度数组;不允许直接引用数组本身进行某种运算,只能通过应用数组的元素间接引用数组,数组元素的数值以前必须先给数组元素赋值;数组元素赋值可以使用赋值语句,也可以通过调用scanf等函数从键盘输入;花括号中的数值列表是用逗号分割的若干个数值的集合;如果在数值列表中给出了所有元素的初值,数组长度说明是可以省略的,但不要省略方括号。

14. 指针

把一个数据所占据的若干存储单元中第一个单元的地址称为该数据的地址。

指针变量的值是一个地址,指针变量的类型不是该地址的类型,而是存放在该地址存储单元中的数据的类型。

定义指针变量:

类型说明*指针变量名

类型说明 *指针变量名1,*指针变量名2,.....

指针变量可以与其他变量一起定义。

变量x地址可以用&x表示,&为取地址运算符:&变量名

取地址运算表达式的返回值是一个地址。

指针变量的赋值:

要为指针变量赋值,可以用已定义的相同类型的普通变量的地址,也可以用已经赋值的另一个相同类型的指针变量的值。

程序中永远不要让指针包含一个位置的地址。

如果程序中暂时还不能确定指针的方向,或者不需要指向某个特定的存储地址。则可以用空指针NULL(或0)为指针赋值。

可以用空指针为任何类型的指针赋值,甚至为空类型(用void声明)的指针赋值,void类型的指针可以指向任何类型的变量,常作为通用的指针。

指针变量的引用:

*指针变量名其运算结果是该指针变量所指向的变量的值。当指针指向某个确定的地址时,可以通过指针运算符“*”引用所指向的数据。

一般不能将指针运算符“*”直接应用于void类型的指针,比如对于“int x; void *p=&x;”直接写*p=3是非法的,因为无法确定*p的数据类型。为此必须使用强制类型转换,即在引用p所指向的变量前,先强行变更为该变量的类型,可将*p=3改为*((int *)p)=3,其中“(int *)”为强制类型转换。

15. 一维数组与指针

可以定义指针指向数组的某个元素。从而通过该指针间接的访问该数组元素。

一维数组的地址:

取地址运算同样适用于数组元素,因此数组元素a[i]的地址是&a[i]。第一个数组元素的地址称为数组的首地址,用数组名表示,所以数组名a被定义为&a[0]。

指针的运算:

C语言中,与指针相关的运算除了赋值运算“=”、取地址运算“&”和指针运算“*”,还有以下几种。(1)指针与整数的加、减法语法:指针±整数若指针p指向数组a第i个元素a[i],则p+1指向下一个元素,即a[i+1],而p-1指向前一个元素,即a[i-1]

(2)左移指针“--”和右移指针“++”语法:指针++或 ++指针指针--或 --指针若指针p指向数组a的第i个元素a[i],则p++使指针右移一位,指向a[i+1],而p--则使指针左移一位,指向a[i-1]。

16. sizeof()运算符的用法

sizeof(运算对象)

表达式的值是运算对象所占内存的存储单元个数。sizeof的运算对象可以是常量变量。也可以是类型说明符。

17. malloc函数

指针=(类型说明*)malloc(数据长度)其中,“(类型说明 *)”是强制类型转换,以保证与指针的类型一致。“数据长度”是一个正整数,表示数据所占内存单元个数——字节数,常用sizeof()运算符来获取。malloc函数的函数值是成功分配的内存单元的地址,若分配内存失败则返回空指针NULL。

18. calloc函数

指针=(类型说明*)calloc(数据个数,数据长度)与malloc函数不同的是,calloc函数可分配若干个数据所占据的连续空间,因此可以将calloc函数分配的空间与等长度的数组对应,而malloc函数只能分配一个变量地址。

19. free函数

使用malloc函数或calloc函数成功分配内存空间后,这些存储单元将被占用,如果不释放,就不能被其他变量使用。为了有效地使用内存资源,程序中动态分配的内存空间必须在使用结束后立即释放,方法是调用free函数。free函数的使用方法是:

free(指针);作用是释放“指针”所指向的动态分配的内存。

20. 二维数组与指针。

指向数组的指针:如何定义与二维数组对应的指针,指针类型必须与数组元素一致,因此与二维数组对应的指针是指向一个一维数组的指针,定义格式为:类型说明(*指针名称)[整型常数]其中,圆括号不能省略。例:int a[行数][列数],(*p)[列数];若指针p指向二维数组a的第i行,即p=a+i,则p++使p指向下一行,p--使p指向上一行。

指向指针的指针:

如果指针的值是另一指针的地址,则该指针是指针的指针,定义为类型说明**指针变量名

指针数组:

如果数组的每个元素都是指针,则该数组为指针数组,定义为

类型说明*数组名[数组长度]

21. 字符串

字符串的存储方法:

C语言中,程序中的字符串使用双引号作为定界符,字符串以字符 '\0' 为结束标识,字符 '\0' 并不显式地出现在字符串中。

字符数组是类型为字符的数组,其定义格式为:char数组名[数组长度]

字符串的输入和输出:

使用scanf函数输入字符串的一般格式为:scanf("%s",字符数组)其中,%s为字符串描述符,与之对应的输入项是字符数组的首地址。

其功能是从键盘缓冲区中读取一个字符串,并存入数组x中。不同于输入其他类型的数据,作为输入参数的数组名x的前面不能再有取地址运算符“&”。值得注意的是,我们已经知道scanf函数使用空白(空格、制表符、回车符等)作为输入数据的分隔符,所以用scanf函数只能输入“单词”字符串:例如:char a[10],b[10],c[10];scanf("%s%s%s",a,b,c);运行程序时,如果输入的是(“_”表示空格)。

printf函数的用法与scanf函数类似,但输出参数可以是字符串常量。使用printf函数输出字符串的一般格式为:printf("%s",字符数组名或字符串常量)这里特别强调数组中存放的是字符串,也就是必有一个元素为 '\0'。

不同于scanf函数,使用gets函数可输入一句话(包含空格、制表符),其语法为:gets(字符数组)存入字符数组的是一个字符串(以 '\0' 结束),但不包括回车符。

与printf函数不同,使用puts函数输出字符串,会在结束时自动换行,其语法为:puts(字符数组或字符串常量)

C语言提供了另一个类似于printf的函数—sprintf函数,可将要输出到终端的内容先以字符串方式存放在字符数组中,以备以后输出到终端。sprintf函数的用法与printf函数基本相同,只是多了一个存放结果的字符数组,其一般格式如下:sprintf(字符数组名,格式控制字符串,输出表列)

字符指针是指向字符串的指针,定义为:char  *指针;可以用字符数组为指针赋值,例如:char  a[]="Welcome to Beijing.";char  *p=a;也可以用字符串常量的地址为指针赋值,例如:char  *p="Hello";

字符串数组是存放了若干字符串的字符数组,字符串数组是一个二维数组。通常每个字符串占据一行,字符串的个数对应数组的行数,最长的字符串的长度对应数组的列数。因此,字符串数组的定义为:char  数组名[字符串个数][字符串长度]要引用字符串数组中的字符串,可使用行地址。第i个字符串的地址为:数组名[i],也可写为:*(数组名+i)。

指向字符串数组的指针:char(*指针)[字符串长度]其中,“字符串长度”必须与字符串数组相同。

如果数组元素是字符指针,每个指针指向一个字符串,则该数组为字符指针的数组,定义为:char  *指针[数组长度]

22. 字符串处理函数

字符串处理函数的原型定义在头文件string.h中,因此,使用这些函数的时候,程序的开始位置需要书写:#include<string.h>

复制已连接:

1. Strcpy函数和strncpy函数两个函数的一般形式是:strcpy(字符数组1,字符串2)strncpy(字符数组1,字符串2,整数n)strcpy函数的功能是将“字符串2”对应的字符串全部复制到“字符数组1”中,结果两个字符串相同。strncpy函数最多将“字符串2”的前n个字符复制到“字符数组1”中。

2. Strcat函数和strncat函数两个函数的一般形式为:strcat(字符数组1,字符串2)strncat(字符数组1,字符串2,整数n)strcat函数将“字符串2”附加在“字符数组1”中的字符串的后边,也就是把两个字符串连接起来再存入“字符数组1”,因此,strcat函数的功能是连接两个字符串。而strncat函数仅把“字符串2”的前n个(不足n个,则为实际个数)字符连接到“字符数组1”的字符串后边。

比较大小:

1. strcmp函数、strncmp函数和stricmp函数这些函数的一般形式是:strcmp(字符串1,字符串2)strncmp(字符串1,字符串2,整数n)stricmp(字符串1,字符串2)这些函数的函数值都是整型的,如果函数值为0,表示两个字符串相等;如果函数值大于0,则“字符串1”大于“字符串2”;如果函数值小于0,则“字符串1”小于“字符串2”。strcmp函数是最常用的函数之一,比较时要从左到右逐一比较每个字符,直到遇到不同的字符或遇到字符串结束符为止。strncmp函数只比较两个字符串的前n个字符,因此strncmp("ABC", "AB", 2)的返回值为0,表示"ABC"和"AB"相等。用stricmp函数比较两个字符串时,将忽略字母符号的大小写,因此"ABC"与"AbC"相等。

2. strstr函数strstr函数的一般形式为:strstr(字符串1,字符串2)strstr函数的功能是在“字符串1”中查找“字符串2”,如果找不到,则函数返回空指针NULL,若找到了,则返回与“字符串1”中所包含的“字符串2”的首字符对应的指针。如果“字符串1”中包含“字符串2”,那么“字符串2”常被称做“字符串1”的子串。求子串是实现查询(检索)的基础。

变换:

1. strlwr函数和strupr函数两个函数的一般用法是:strlwr(字符数组)strupr(字符数组)strlwr函数将存放在“字符数组”中的字符串里的所有大写字母转化为小写字母,而strupr函数则相反,将小写字母转化为大写字母。转换后得到的字符串仍存放在“字符数组”中。

2. atoi函数和atof函数这两个函数的原型在stdlib.h中,一般用法是:变量=atoi(字符串)变量=atof(字符串)atoi函数将“字符串”转化成整数,并作为函数值返回,而atof函数则转化为实数。

其他:

用strlen函数可计算字符串的长度,用法是:变量=strlen(字符串)strlen函数的函数值是一个整数,表示“字符串”的长度,即结束符 '\0' 前的字符的个数。与sizeof(字符串)不同,用strlen函数求得的并不是数组长度(所占内存的字节数)

23. 函数

函数的定义形式如下:数据类型 函数名(参数声明列表){说明与语句}其中有些部分是可以省略的。最简略的函数是下面的形式:函数名(){}这样的函数不做任何事情,称为空函数。

函数是通过return语句返回给其调用者数值的。return后面可以跟任何形式的表达式:return表达式;

调用者称为主调函数,而把被调用者称为被调函数。函数还可以自己调用自己,称为递归调用。main函数是主函数,它可以调用其他函数,而不允许被其他函数调用。因此,C语言程序的执行总是从main函数开始,完成对其他函数的调用后再返回到main函数,最后由main函数结束整个程序。一个C语言源程序必须有也只能有一个主函数main。

函数的参数:函数的参数分为形式参数(简称形参)和实际参数(简称实参)两种。形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。实参出现在主调函数中,进入被调函数后,实参变量也不能使用。形参和实参的功能是做数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。① 实参可以是常量、变量、表达式等。无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此,应预先用赋值、输入等方法使实参获得确定值。② 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。③ 实参和形参在数量、类型、顺序上应严格一致,否则会发生“类型不匹配”的错误。④ 函数调用中发生的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。因此,在函数调用过程中,形参的值发生改变,而实参中的值不会变化。

函数的返回值:

将函数实现的结果返回给调用者,要从函数传出一个数值,必须用到关键字return,而且数据类型必须和函数的返回类型相匹配。实际上,所有的函数都有一个返回值。对于void类型的函数,函数不用写return语句或者return语句后面不带任何表达式。对于int类型的函数,不写return语句时,相当于执行了“rerun 0;”语句。其实,主函数main也是有返回类型的。有时将其定义void main(),表明其返回值为void。有时将主函数定义为int main(),或者省略类型直接定义为main(),都表示函数的返回类型为int。main函数的返回值是直接给操作系统的。

库函数的原型:

一般来说,库函数的原型在系统提供的头文件中。

c语言 字符串 按 长度分割_C语言查询要点

这种思想也可以借鉴来定义我们自己的函数原型。即将定义好的函数的原型放入一个“.h”的头文件中,然后在使用这些函数的模块里使用#include预编译命令包含这个头文件,进而给出函数的原型。

函数的递归调用:一个函数在它的函数体内调用他自身称为递归调用。这种函数称为递归函数。

24. 变量的作用域

C语言中的变量按作用域范围可分为两种。局部变量和全局变量。

25. 变量的存储类型

所谓存储类型是指变量占用内存空间的方式,也称为存储方式。变量的存储方式可分为“静态存储”和“动态存储”两种。静态存储变量通常是在变量定义时就分定存储单元并一直保持不变,直至整个程序结束。动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放。典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配,调用函数完毕立即释放。如果一个函数被多次调用,则反复地分配、释放形参变量的存储单元。

在C语言中,对变量的存储类型说明有以下4种:● auto:自动变量。● register:寄存器变量。● extern:外部变量。● static:静态变量。自动变量和寄存器变量属于动态存储方式,外部变量和静态变量属于静态存储方式。

变量说明的完整形式应为:存储类型说明符 数据类型说明符 变量名,变量名……;

auto变量:这种存储类型是C语言程序中使用最广泛的一种类型。C语言规定,函数内凡未加存储类型说明的变量均视为自动变量,也就是说自动变量可以省去说明符auto。在前面各章的程序中所定义的变量凡未加存储类型说明符的都是自动变量。自动变量具有以下特点。① 自动变量的作用域仅限于定义该变量的个体内。在函数中定义的自动变量,只在该函数内有效。在复合语句中定义的自动变量只在该复合语句中有效。② 自动变量属于动态存储方式,只有在使用它,即定义该变量的函数被调用时,才给它分配存储单元,开始它的生存期。函数调用结束时,释放存储单元,结束生存期。因此,函数调用结束之后,自动变量的值不能保留。在复合语句中定义的自动变量,在退出复合语句后也不能再使用,否则将引起错误。③ 由于自动变量的作用域和生存期都局限于定义它的个体内(函数或复合语句内),因此不同的个体中允许使用同名的变量而不会混淆。即使在函数内定义的自动变量也可以与该函数内部的复合语句中定义的自动变量同名。

extern变量:在前面介绍全局变量时已介绍过外部变量。下面再补充说明外部变量的几个特点。① 外部变量和全局变量是对同一类变量的两种不同角度的提法。全局变量是从它的作用域提出的,外部变量是从它的存储方式提出的,表示了它的生存期。② 当一个源程序由若干个源文件组成时,在一个源文件中定义的外部变量在其他的源文件中也有效。

static变量:将保留字static加在一个函数体定义的变量前,那么这个变量就成为静态局部变量,它在这个函数的每次调用时都占用同一块内存区域。因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可以考虑采用静态局部变量,有时这种定义方式很有用。将保留字static加在一个外部变量前,则将会使这个外部变量“私有化”,就是说将会使这个外部变量只能在本文件之内使用,在其他文件内即使使用extern说明了这个变量,它仍然不可以被访问。静态局部变量属于静态存储方式,它具有以下特点。① 静态局部变量在函数内定义,但不像自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。② 静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。③ 允许对构造类静态局部变量赋初值。在第6章中介绍数组初始化时已做过说明。若未赋初值,则由系统自动赋0值。④ 对基本类型的静态局部变量若在说明时未赋初值,则系统自动赋0值。而对自动变量不赋初值,则其值是不定的。根据静态局部变量的特点,可以看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。

register变量:通常,变量都存放在存储器内,因此当对一个变量频繁读写时,必须要反复访问内存储器,从而花费大量的存取时间。为此,C语言提供了另一种变量,即寄存器变量。这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,这样变量的存取效率可大大提高。寄存器变量的说明符是register。由于寄存器的特点,只有整型或者字符型变量可以声明为寄存器变量。其他类似的类型如unsigned、long或short也可以声明为寄存器变量。实际上,任何编译器都只允许使用有限个寄存器变量,而且一旦没有寄存器可以使用,编译器将忽略寄存器变量,而只把它当成普通的变量。因此,通过使用寄存器变量获得的速度提高是有限的。

26. 自定义数据类型

结构体:

结构体定义的一般形式如下:struct  结构体类型名{数据类型  成员1;数据类型  成员2;……数据类型  成员n;};struct关键字后面是结构体类型名,接着是一对大括号“{}”,它们表示结构体类型定义的开始和结束。括号后面要有分号“;”,表示整个定义结束。在括号中,与声明程序变量一样声明结构体的数据成员。在结构体中的成员还可以使用用户自定义的类型,包括结构体类型。

通过结构体指针变量访问结构体成员的两种方法如下。(1)使用点操作符:(*结构体指针变量名).成员名(2)使用箭头操作符:结构体指针变量名->成员名

共用体(union):是将不同的数据类型组合在一起,共同占用同一段内存的用户自定义数据类型。共用体的声明方法与结构体类似,只是将关键字struct改为了union。

对比结构体和共用体,可以发现:① 结构体和共用体都是由多个不同的数据类型成员组成的,但在任何同一时刻,共用体中只存放了一个被选中的成员,而结构体的所有成员都存在;② 对于共用体的不同成员赋值,将会对其他成员重写,原来成员的值就不存在了,而对于结构体的不同成员赋值是互不影响的。

除了使用C语言提供的标准类型名(如int、char、float、double等)、结构体和共用体之外,还可以用typedef声明新的类型名来代替已有的类型名。一般来说,typedef新定义的类型用大写字母表示,以区别于原有的数据类型。

枚举类型定义的一般形式如下:enum枚举名{枚举值表};在“枚举值表”中应罗列出所有可用值。这些值也称为枚举元素。例如:enum weekday{sun,mou,tue,wed,thu,fri,sat};该枚举名为weekday,枚举值共有7个,即一周中的7天。凡被说明为weekday类型变量的取值只能是7天中的某一天。如同结构体和共用体一样,枚举变量也可以用不同的方式说明,即先定义后说明、同时定义说明或者直接说明。

① 枚举值是常量,不是变量,不能在程序中用赋值语句再对它赋值

② 枚举元素本身由系统定义了一个表示序号的数值,从0开始顺序定义为0, 1, 2,…。③ 只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。④ 枚举类型也可以使用typedef重新定义。

27. 预处理命令

C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等。

c语言 字符串 按 长度分割_C语言查询要点

#define命令定义了一个标识符及一个串,可以用来创建命名常量和宏。在源程序中每次遇到该标识符时,均以定义的串代换它。在C语言源程序中允许用一个标识符来表示一个字符串,称为宏。

#undef用来取消宏定义,它与#define对立:#undef  标识符如果被取消的宏实际上没有被#define所定义,针对它的#undef并不会产生错误。当一个宏定义被取消后,可以再度定义它。

预定义宏:

提供当前编译的信息。

c语言 字符串 按 长度分割_C语言查询要点

#include包含

预处理器发现#include命令后,就会寻找后面跟着的文件名并把这个文件的内容包含到当前文件中。目前,我们的程序大多都使用了#include命令,此命令用于文件包含。这些文件包含了编译器所需的信息。很多情况下,头文件中的内容是编译器产生最终代码所需的信息。#include的格式如下:#include"文件名"#include#include预处理标记注意,所在的行不能含有除注释和空白符之外的其他任何内容。用尖括号“<”和“>”括起来表明这个文件是一个工程或标准头文件。查找过程会检查预定义的目录。可以通过设置搜索路径环境变量或命令行选项来修改这些目录。如果文件名用一对引号括起来则表明该文件是用户提供的头文件,查找该文件时将从当前文件目录(或文件名指定的其他目录)中寻找文件,然后再在标准位置寻找文件。

条件编译:

编译命令#if、#elif、#else、#endif用于条件编译,基本格式如下:#if常量表达式1语句……#elif常量表达式2语句……#elif常量表达式3语句……#else语句……#endif#if和#else分别相当于C语言语句中的if和else,它们根据常量表达式的值来判别是否编译后面的语句。#elif相当于C语言中的else if,#else之后不带常量表达式。常量表达式可以是包含宏、算术运算、逻辑运算等的合法C常量表达式。如果常量表达式为一个未定义的宏,那么它的值被视为0。

28. 文件操作

文件系统中,文件句柄是一个重要的概念。每个被使用的文件,都在内存中开辟一个区域,用来存放文件的有关信息,例如,文件的状态以及当前位置等。这些信息保存在一个结构体变量中,结构体的类型是由系统定义的。在C语言中,该结构体取名为FILE要处理文件,程序必须创建文件句柄指针变量并打开文件,然后用输入函数从文件中读取数据,用输出函数向文件中写入数据。

不论对哪种类型的文件,程序都调用fopen函数打开文件。fopen函数的一般格式为:文件句柄指针=fopen(文件名字符串,文件打开方式字符串)fopen函数的第1个参数是包含文件名的字符串,第2个参数是包含一个或多个文件说明符的字符串

c语言 字符串 按 长度分割_C语言查询要点

不论对哪种类型的文件,程序都调用fclose函数关闭文件。fclose函数的一般格式为:fclose(文件句柄指针);

文本文件的操作:

c语言 字符串 按 长度分割_C语言查询要点

二进制文件的操作:

c语言 字符串 按 长度分割_C语言查询要点
c语言 字符串 按 长度分割_C语言查询要点

标准文件:

文本文件和二进制文件都是指存储在磁盘或磁带上的信息流。实际上,针对每个程序,系统还打开了3个标准文件,它们是stdin、stdout、stderr,分别是standard input(标准输入)、standard output(标准输出)、standard error(标准出错)的缩写。文件stdin是程序可以读取其输入的位置,默认情况下,从键盘读取。stdout是程序写入其输出的位置,除非将其定向到其他地方,否则标准输出通常出现在显示器上。stderr是程序发出错误和特殊消息的地方,除非将其定向到其他地方,否则标准错误通常出现在显示器上。实际上,不论在标准文件系统还是非标准文件系统中,文件结构只需要用文件句柄或文件代号代替,前面介绍的文件操作函数也均适用。

其他文件操作函数:

c语言 字符串 按 长度分割_C语言查询要点

29. 位操作

c语言 字符串 按 长度分割_C语言查询要点

移位运算:移位包括左移和右移。1.<<左移位左移位就是将一个数的各二进制位左移指定位数,右边补0,高位左移溢出后,舍弃不用。把一个数左移1位,相当于用该数乘以2,当然也存在溢出的问题。2.>>右移位右移位就是将一个数的各二进制位右移指定位数,左边补该数的符号位,低位右移溢出后,舍弃不用。把一个数右移1位,相当于用该数除以2,当然也存在舍弃小数的问题。需要说明的是,对于无符号数,高位不再代表符号,因此在右移时,高位会补0。

c语言 字符串 按 长度分割_C语言查询要点

30. ASCLL码表

c语言 字符串 按 长度分割_C语言查询要点

继续阅读