寒假c语言笔记回顾 1:“void main()”等效于”int main(void)”; 2:“Don’t ”在编译环境下输入方式应该为“Don/’t”;(/’序列称为转义序列(escape sequence)); 3:注释说明代码的作者及版权所有(格式):/* * Written by liuning * Copyright 2010 */ 4:“#include<stdio.h>”:“#”表示这是一个预处理命令(preprocessor directive); 5:使用转义序列“/a”可以发出声音,并且不会输出; 6: long(long double)类型的数值后面应该加大写字母L或小写l。 eg:long Big_number=10L(或者 10l); unsigned long类型的数值后加“UL” 7:将整数常量指定为long long 类型时,应添加两个“L” Eg:longl long ready_big_number=-123456789LL; 8:将常量指定为无符号类型时,应添加“U” Eg:unsigned int count=100U; 9:编写一个float常量,需要在数值的末尾加上一个f,以区别double类型。 Eg: float Radius=2.5f; double Biggest=123E30; 10: 读取数据的格式指定符(表)
操作 需要的控制字符串 读取short类型的数值 %hd 读取int类型的数值 %d 读取long类型的数值 %ld 读取float类型的数值 %f或%e 读取double类型的数值 %lf或%le
11: #define PI 3.14159f 等效于:const float pi=3.14159f;
12:隐式类型转换:
(1) 如果一个操作数的类型是long double,就把另一个操作数转换为long double类型。
(2) 否则。如果一个操作数的类型是 double,就把另一个操作数转换为double类型。
(3) 否则。如果一个操作数的类型是 float,就把另一个操作数转换为float类型。
(4) 否则。如果两个操作数的类型都是带符号的整数或无符号的整数,就把级别较低的操作数转换为另一个操作数的类型,无符号整数类型的级别从低到高为:signed char, short,int ,long,long long。每个无符号整数类型的级别都与对应的带符号的整数类型相同,所以unsigned int类型的级别与int类型相同。
(5) 否则。如果带符号的整数类型的操作数级别低于无符号整数类型的级别,就把带符号整数类型的操作数转换为无符号整数类型。
(6) 否则。如果带符号整数类型的值域包含了无符号整数类型所表示的值,就把无符号整数类型转换为带符号的整数类型。
(7) 否则。两个操作数都转换为带符号整数类型对应的无符号整数类型。
13:宽字符类型:wchar_t类型的变量存储多字节字符码;并且在标准标准头文件<stddef.h>中定义。在char 类型的字符常量前面添加修饰符“L”就可以定义一个宽字符。 wchar_t wch=L'A'; 如果要把一个字符读入wchar_t类型变量,可以使用%lc格式指定符。如果要使用printf()将字符串输出到屏幕上,则必须用%S(大写S)格式指定符。
14:布尔变量的使用时需要包含<stdbool.h>头文件。
15: 测试字符的函数(表)
函 数 |
测 试 内 容 |
islower() |
小写字母 |
Isalpha() |
大写或小写字母 |
Isupper() |
大写字母 |
Isalnum() |
大写或小写字母,或数字 |
Iscntrl() |
控制字符 |
Isprint() |
可打印字符,包括空格 |
Isgraph() |
可打印字符,不包括空格 |
Isdigit() |
十进制数字(0~9) |
Isxdigit() |
十六进制数字(’0’~’9’,’A’~’F’,’a’~’f’) |
Isblank() |
标准空白字符(空格,’/t’) |
Isspace() |
空位字符(空格,’/n’,’/t’,’/v’,’/r’,’/f’) |
Ispunct() |
Isspace()和isalnum()返回false的可打印字符 |
16:c中的字符串总是由/0字符结束,所以字符串的长度永远比字符串的字符数多1.
17:printf()函数在遇到第一个空字符/0时就停止输出。
18:strcpy()函数的参数是char 数组名 strcpy(string1,string2).
作用:将第二个参数指定的字符串复制到第一个参数指定的字符串中。(注:只有string2数组长度小于等于string1数组长度时 才执行该函数)
可以用以下方法检查:
If(sizeof(string2)<= sizeof(string1))
strcpy(string1,string2);
19:strncpy()函数的参数是char的数组名 strncpy(a,b,n).
作用:将一个字符串中的前n个字符复制到另一个字符串中,第一个参数是目标字符串,第二个参数是源字符串,第三个参数是一个size_t类型的整数。Eg:
char a[]=”This string will be repolaced”;
char b[]=”This string will be copied in part”;
size_t n=26;
strncpy(a,b,n); 运行结果是在数组a后面包含字符串“This string will be copied”(b数组中的前26个字符)
20:类型size_t在标准库头文件<stddef.h>中定义。(如果要输入size_t类型的变量,则应该为:scanf(“%u”,&**);)
21:strcat()函数 strcat(string1,string2).作用:将string2复制到string1的末尾,并删除string1后的串标志”/0”.(注:strncat()函数的使用方法是与19中的strncpy()函数的作用一样,作用也类似)
22:strcmp()函数 strcmp(tring1,string2),作用:按照ASCII码顺序比较两个数组中字符串(逐字符比较)eg:
char str1[]=”The quick brown fox”;
char str2[]=”The quick black fox”;
if(strcmp(str1,str2)<0)
printf(“str1 is less than str2 ”); (注:strncmp()函数的使用方法与19类似,但作用是比较两个字符串前n个字符)
23:sizeof运算符可以计算出制定类型的变量所占字节数,siezof运算符后类型名称外的括号是必须的。少了则不会编译:
eg:printf(“/nThe size of a variable of type long is %d bytes”, sizeof(long));
(注:但其应用于变量时,不需要使用括号:eg:
alues)/sizeof(values[0]);
printf(“The size of the array is %d bytes”,sizeof(values));
printf(“and there are %d elements of %d bytes each”,avi,sizeof(values[0]));
输出如下语句:int avi=sizeof(v
The size of the array is 40 bytes and there are 5 elements of 8 bytes each ).
24:strchr()函数作用:在一个字符串中查找给定字符第一个匹配之处Eg
char str[15];
char *ptr,c=’r’;(int c=’r’;也可)
strcpy(str,”this is a string”);
ptr=strchr(str,c);
25:strrchr()函数则是在一个字符串中查找给定字符最后一个匹配之处
26:strstr()函数则是在字符串中查找指定字符串的第一次出现Eg:
char text[]=”Ever dog has his day”;
char word[]=”dog”;
char *pfound=NULL;
pfound=strstr(text,word);
27:gets()函数与fgtes()函数的区别:前者在字符串末尾自动附加‘/0’;
后者会附加‘/n/0’;且 后者在读取字符串时比前者多一个字符;前者不能检查是否有足够的空间存储该字符串,后者可以应用于任意种类的输入字符串。
28:
函 数 |
返 回 值 |
atof() |
从字符串参数中生成的double类型值 |
atoi() |
从字符串参数中生成的int类型值 |
atol() |
从字符串参数中生成的 long 类型值 |
atoll() |
从字符串参数中生成的long long类型值 |
使用方法:eg:
Char value_str[]=”98.4”;
Double value=0;
Value=atof(value_str); 数组value_str含有double类型值的字符串,将数组名作为参数传给atof()函数,就可以把它转化成double类型,其余函数用法一致。
29:<wchar.h>头文件声明了函数来操作宽字符;
宽字符分类函数
函 数 |
测 试 内 容 |
iswlower() |
小写字母 |
Iswupper() |
大写字母 |
Iswalnum() |
大写或小写字母 |
Iswcntrl() |
控制字符 |
Iswprint() |
可打印字符,包括空格 |
Iswgraph() |
可打印字符,不包括空格 |
Iswdigit() |
十进制数字(L’0’~L’9’) |
Iswxdigit() |
十六进制数字(L’0’~L’9’,L’A’~L’F’,L’a’~L’f’) |
Iswblank() |
标准空白字符(空格,L’/t’) |
Iswspace() |
空位字符(空格,L’/n’,L’/t’,L’/v’,L’/r’,L’/f’) |
Iswpunct() |
Isspace()和isalnum()返回false的可打印字符 |
30:char类型值的指针指向占有一个字节的值,而long类型值的指针通常指向占有4个字节的值。
31:间接运算符*可以访问指针所指的变量值,该运算符也称为取消引用运算符(dereferencing operator)。
32; 访问数组元素的指针表达式
board |
0 |
1 |
2 |
0 |
bard[0][0] *board[0] **board] |
board[0][1] *(board[0]+1) *(*board+1) |
board[0][2] *(board[0]+2) *(*board+2) |
1 |
bard[1][0] *(board[0]+3) *board[1] *(*board+3) |
bard[1][1] *(board[0]+4) *(board[1]+1) *(*bard+4) |
bard[1][2] *(board[0]+5) *(board[1]+2) *(*board+5) |
2 |
bard[2][0] *(board[0]+6) *board[2] *(*board+6) *(board[1]+3) |
bard[2][1] *(board[0]+7) *(board[1]+4) *(*board+7) *(board[1]+4) |
bard[2][2] *(board[0]+8) *(board[1]+5) *(*board+8) *(board[1]+5) |
33:动态内存分配:malloc()函数:使用方法及格式:
Eg1: int *pnumber=(int *)malloc(100); 请求100个字节的内存,并将内存块地址赋予pnumber.
Eg2: pNumber=(int *)malloc(75*sizeof(int)); 请求分配足以存储75个int数据项的内存。
34:calloc()函数分配内存:在<stdlib.h>头文件中声明calloc()函数与malloc()函数相比有两个优点,一是,它把内存分配为给定大小的数组,二是,初始化了所分配的内存,所有的位都是0;(使用calloc()函数需要两个参数:数组元素个数和数组元素所占字节数且两参数类型都是:size_t。) 使用格式及方法:
Eg1: int *pNumber=(int *)calloc(75,sizeof(int));
Eg2: primes=(unsigned long *)calloc(total,sizeof(unsigned long));
35:释放动态分配的内存:用 free()函数;eg: 将free(primes),(primes是malloc()或calloc()函数给其分配的内存)用于程序结尾。
36:重新分配内存:realloc()函数可以重用前面通过malloc()或calloc()(或realloc())分配的内存。该函数需要两个参数 一个是指针,它包含前面调用malloc()或calloc()或realloc()返回的地址;另一个是要分配的新内存的字节数。
使用方法及格式:eg: long *pData=NULL;
size_t count=0;
pData=(long *)realloc(pData,sizeof(long)*count)
37:没有返回值的函数必须将返回值的类型指定为void,而返回值类型不是void 的函数都在函数体中有个return语句,返回一个指定返回类型的值。
38:静态变量:在退出一个函数函数调用后,该调用中的数据可以在程序其他函数中使用。例如下面语句声明一个静态变量count: static int count=0; static是C的关键字,该句声明的变量和自动变量有两个不同点:一是:虽然它在函数的作用域类定义,但当的退出执行该函数后,这个静态变量不会被删除;二是:自动变量每次进入作用域,都会初始化一次,但是声明为static的变量只在程序开始时初始化一次;(见program103)
注:静态变量只能在包含其声明的函数中可见,但它是一个全局变量,可以用全局变量的方式使用它。
39:长度可变的变元列表的基本规则:(实现变元个数可变的函数时,必须同时使用三个宏:va_atart(),va_arg(),va_end())
1在变元数目可变的函数中,至少要有一个固定变元。
2必须调用va_start()初始化函数中可变变元列表指针的值,变元指针的类型必须声明为va_list类型。
3必须有确定每个变元类型的机制。可以假设默认的类型或用一个参数来指定变元类型。
4必须有确定何时终止变元列表的方法。
5va_arg()的第二个变元指定了变元值的类型,这个指针类型可以在类型名的后面加上*来指定。
6在退出变元数目可变的函数前,必须调用va_end(),否则函数将不会正常工作。
(标注库函数<stdarg.h>提供了编写该种函数的例程见program106)
40: 转换字符及其含义
转换字符 |
含 义 |
d |
将输入转换为int |
i |
将输入转换为int,如果加了前缀o,就输入八进制,如果前加了ox或oX,就输出十六进制, |
o |
将输入转换为Int,并假定所有的数字都是八进制数 |
u |
将输入转换为unsigned int。 |
x |
将输入转换为int,并假定所有的数字都是十六进制 |
c |
将下一个字符读入为char 类型(包括空白),如果在读入单个字符时要忽略空白,就在格式指定符的前面加上一个空白字符 |
s |
从下一个非空白字符开始,输入一串连续的非空白字符 |
e, f或g |
将输入转换为float类型,输入中的小数点和指数是可选的 |
n |
不读入任何输入,但前面读到此处为止的数字字符存储在对应的int*类型参数中。 |
41: 转换指定符应用
指定符 |
说 明 |
%lf |
将下一个值读取为double类型 |
%*d |
读入下一个整数值。但不存储它 |
%lc |
将下一个字符取读为wchar_t类型 |
%/nc |
将下一个字符取读为char类型,并忽略空白字符 |
%10lld |
将接下来的10个字符取读为long long类型整数值 |
%5d |
将接下来的5个字符读取为一个整数 |
%hu |
将下一个值读取为unsigned short类型 |
%Lf |
将下一个值读取为long double类型的浮点数 |
42:”->”运算符是一个负号后跟一个大于符号,该运算符称为:成员指针运算符,
Printf(“/nThe name is %s.”,(*phorse).name);可以改写为:
Printf(“/nThe name is %s.”,phorse->name);这个表示法几乎可用于取代通常的取消引用指针表示法。(广泛用于结构指针)
43:强制转换:float c; int a,b;
C=float(a)/float(b);或c=(float)a/(float)b;