C语言Tips
Tips
零. 写在前面
- 'a'(字符常量)和"a"有区别
- 调试时:监视里面输入(type()[number])begin
type,类型
number,查看数量
begin,起始地址指针 - 函数可以改变数组的值,但是不能改变变量的值,只是表象:因为数组修改x[0]是自动就该地址了,相当于已经用过指针了。字符数组scanf不用&
一.关于输入Input,输出Output
Input
- fflush(stdin); 清除输入缓冲区
- scanf()函数按s格式符不能输入带空格的字符串,读%d或者%s时,读到空格、回车、制表符等空白字符,认为读入结束;
- gets()函数可以处理带空格的字符串。
- fgets(name,sizeof(name),stdin);限制输入字符串长度的函数
- 区别:gets以回车符作为终止符,同时将回车符从输入缓冲区读走,但不作为字符串的一部分;而scanf()不读走回车符,回车符仍然留在输入缓冲区中。
- 例:
char name[N];
scanf("%s",name);
get(name);
- scanf("%d%d",&a,&b)!=EOF;
-
遇到这个表达式:scanf("%d%d",&a,&b)!=EOF;
如果a和b都被成功读入,那么上面表达式的结果为2;
如果只有一个读入,那么上面表达式的结果为1;
如果a&&b都没有读入,那么上面表达式的结果为0(若a没有读入,则直接放弃b的读入);
如果遇到错误或者文件结尾,那么上面表达式的结果为EOF,对应的有符号数时-1;
如果遇到Crrl+Z,那么上面表达式的结果为EOF,对应的有符号数时-1; -
EOF在scanf连用时代表-1的意思,当用到while(scanf()!=EOF),
代表的意思是一直输入,直到scanf返回的值是-1时才会停止输入,
也可以在while里面加上一些约束条件,使输入在特定的条件下就会停止,
也可以在输入完成后按下 ,Ctrl+z,可以强行停止输入。
Onput
puts()函数用于从括号内的参数给出的地址开始,依次输出储存单元中的字符,当遇到第一个'\0'时输出结束,并且自动输出一个换行符。
printf("name\n",name);
puts(name);
二.数组(Array)的定义 :一组具有相同类型的变量的集合。
一维数组:
int score[SIZE];
- 其中"int"代表该 数组的基类型(Base Type)(数组中的元素的类型),"SIZE"下表的个数表明 数组的维数(Dimension)
- 第一个元素为score[0], SIZE要么不写,要么是常量,不能是变量
- 例如:
int score[5] = {0,0,0,0,0};
二维数组:
dataType arrayName[length1][length2]; // 行数:length1 ,列数:length2
- 第二维长度不能忽略。
- 例如:
int matrix[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};//等价
int matrix[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int matrix[][4] = {{1,2,3},{4,5},{6}}; //等价
int matrix[3][4] = {{1,2,3,0},{4,5,0,0},{6,0,0,0}};
三.字符串(Character string)
定义
char str[6] = {'H','e','l','l','o','\0'}; '\0'在字符串中也占内存,自动添加
char str[]= {"Hello"}; char str[] = "Hello";
char weekday[7(可省略)][10] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};\\长度为10,不足补'\0'
字符串处理函数
(1) strlen(str);字符串长度
由函数值返回字符串str的实际长度,不包括'\0'.
(2) strcpy(str1,str2);字符串复制
将字符串str2复制到字符数组str1中,这里确保str1大小足以容纳str2.
(3) strcmp(str1,str2);字符串比较
str1大于str2,返回值大于0;
str1等于str2,返回值等于0;
str1小于str2,返回值小于0;
按照ASCII码值从左到右比较。
(4) strcat(str1,str2)字符串连接
str2添加到str1末尾,函数调用后返回字符数组str1的首地址。(str1要定义的足够大)
(2)(3)(4)若写成(str1,str2,n)即对str2前n个字符进行操作。
四.结构体
定义
(1)先声明结构体,在定义结构体变量
struct 结构体名 结构体变量
struct 结构体名
{
数据类型 成员1名字
数据类型 成员2名字
};
或者如下定义
(2)struct 结构体名
{
数据类型 成员1名字
数据类型 成员2名字
}结构体变量;
(3)typedef struct student STUDENT;
STUDENT stu1,stu2;
结构体数组
STUDENT[30] = {{},{},{}}
五.其他数据类型
共用体
union
共用体是将逻辑相关,情形互斥的不同数据组织在一起形成的数据结构,每一时刻只有一个数据成员起作用。
枚举数据类型
enum response{no,yes,none};
enum response answer;
第一句声明了名为response的枚举类型,同时列出取值可能,第二句定义了response枚举型变量answer。
六.指针(Pointer)
取地址运算符(Address Operator),
- 即&. (%p格式符,表示输出变量地址值),地址值是用一个十六进制(以16为基)的无符号整数表示,其字长一般与主机字长相同。
例:
printf("%d,%p",a,&a); //表示print出a的值和地址值。
指针的定义与初始化
- 类型关键字 *指针变量名
- 例:
int *pa;
pa = &a; //初始化指针变量pa,使其指向a
*pa = 2; //直接从地址上改变指向的值
- 指针运算符也称为间接寻址运算符或者引用运算符即*,用来访问指针变量指向的变量的值。
例: 函数指针直接改变传入参数的值
Swap(&x,&y);
void Swap(int *x,int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
函数指针
void SelectionSort(int a[],int n,int (*compare)(int a,int b));
int Ascending(int a,int b);
int Descending(int a,int b);
main()
{
SelectionSort(score,n,Ascending);
SelectionSort(score,n,Descending);
}
void SelectionSort(int a[],int n,int (*compare)(int a,int b))//选择法排序
{
int i,j,k;
for(i=0;i<n-1;i++)
{
k = i;
for(j=i+1;j<n;j++)
{
if((*compare)(a[j],a[k]))
{
k = j;
}
}
if(k!=i)
{
Swap(&a[k],&a[i]);
}
}
}
int Ascending(int a,int b)
{return a > b;}
int Descending(int a,int b)
{return a < b;}
七.文件操作
- C语言文件类型有两种:文本文件(ASCII码文件),二进制文件
文件的打开与关闭
"r": 以只读方式,打开文本文件
"w": 以只写方式,创建并打开文本文件,已存在的文件将被覆盖
"a": 以只写方式,打开文本文件,位置指针移动到文件末尾,向文件尾部添加数据,原数据保留
"+": 与上面字符串组合,以读写方式打开文本文件,可写可读
"b": 与上面字符串组合,表示打开二进制文件
例:文件指针fp是指向FILE结构类型的指针变量
FILE *fp;
fp = fopen("D: \\demo.txt","a+"); //在demo文件中读写
fp == NULL; 判断是否读取成功
读写文件中的字符
fputs(char,fp): 用于将一个字符写到一个文件上。
feof(fp): 用于检查是否到达文件末尾,当文件位置指针指向文件结束符时。返回非0值,否则返回0值。
fgets(char *s,n,fp): 用于从一个以只读或读写方式打开的文件上读字符。读取字符串并在末尾添加'
0',然后存入s,最多读n-1个字符