字符串
-
以0结尾的一串字符
-
0或'\0'等价但是与'0'不同
-
0标志着字符串的结束,但它不是字符串的一部分,故计算字符串长度的时候不包括0
-
字符串以数组的形式存在,可以以数组或指针的形式访问(指针居多)。
字符串变量
char *str ="hello"; char word[] ="hello"; char line[10]="hello";
字符串常量
-
"hello"会被编译器编译成一个字符数组,这个数组的长度为6,(结尾是表示结束的0)
-
两个相邻的字符串(中间没有其他符号)会被连接起来 char*s="Hiello,world!";这里的S是一个指针,初始化为指向一个字符串常量 。
-
不要对S所指的字符串做写入:S[0]=x;
-
如果需要修改字符串,应该用数组:char S[]="Hello,world!";
数组:字符串在这里作为本都变量空间自动被回收
指针:不知道字符串的位置
一般用作处理参数和动态分配空间
因此
构造字符串用数组
处理字符串用指针
<!--只有char*所指的字符数组有结尾0,才能说它所指的是字符串-->
空字符串
-
char buffer[100]="";
表示这是一个空的字符串,buffer[0]=='\0
-
char buffer[]="";
表示这个数组的长度只有1!
字符串数组
-
char **a a是一个指针,指向另一个指针,那个指针指向一个字符(串)
-
char a (二维数组要有确定的大小)
或者a[]={} 其中a[0]相当于char;
<!--switch语句可以用字符串数组写-->
单字符的输出与输入
int putchar(int c);
输出一个字符
当输出不能用了会返回EOF
int getchar(void);
从标准输入读入一个字符
string.h
size_t strlen(const char *s);
返回S的字符串长度(不包括结尾的0)
<!--sizeof(x)中包括结尾的0-->
strcmp
int strcmp(const chars1, const chars2);
比较两个字符返回
0:s1==s2
1:s1>s2
-1:s1<s2
返回两个不相等字符的差值。
strcpy
charstrcpy(char * restrict dst, const char *restrict src);
把src的字符串拷贝到dst
返回dst
复制字符串
char * dst =(char * )malloc(strlen(src)+1);
strcpy(dst,src);
strcat
char * strcat(char * restrict s1,const char * restrict s2);
将S2拷贝到S1的后面,接成一个长的字符串
返回S1
注意S1必要有足够空间
枚举法
-
枚举使用户定义的数字类型,它用关键字 enum以如下语法来声明:
-
enum+名字{名字1 名字2.......}
-
大括号里面的名字是字符常量,它们的类型是int,值则依次从0到n:
-
enum colors{red,yellow,green};
#include <stdio.h> enum color{red,yellow,green}; int main(int argc,char const *argv[]) { int color=-1; ,char *colorname=MNLL; scanf("%d",&color); switch(color) { case red:colorname="red";break; case yellow:colorname="yellow";break; case green:colorname="green";break; defauit: colorname="unknown";break; } printf("你喜欢的颜色是%s\n",colorname); return 0; }
-
枚举的量可以用作值
-
枚举类型可以跟上enum作为类型
-
实际上enum可以看作int来对数据进行输出输入
#include <stdio.h> enum color{red,yellow,green}; void f(enum color c); int main(void) { enum color t =red; scanf("%d",$t); f(t); return 0; } void f(enum color c) { printf("%d\n",c); }
结构类型
声明结构类型
-
struct date
-
函数内部声明的结构只能在函数内部使用,在外部声明结构类型就可以被多个函数使用。
声明结构的形式
1.
struct point{ int x; int y; }; struct point p1,p2;
2.
struct point{ int x; int y; }p1,p2;
3.
struct { int x; int y }p1,p2;
-
1.和2.中都声明了结构point并且定义了变量,3.中只是定义了两个变量。
结构成员
-
结构与数组有点像
数组中有很多单元;结构里面有很多成员。但数组的单元必须是相同类型的,而结构的成员不一定是相同的。
-
数组用[]运算符和下标访问其他成员:a[0]=10;
-
结构用'.'运算符和名字访问其他成员:pl.x today.day;
结构运算
-
要访问整个结构,直接用结构变量的名字
-
可以对整个结构做赋值,取地址,也可以传递给函数参数
例如: (数组不可以做如下运算)
-
pl=(struct point){5,10};
-
相当于pl.x=5;pi.y=10;
-
pl=p2;
-
相当于pl.x=p2;pl.y=p2.y;
-
结构变量的名字并不是结构变量的地址,必须使用&运算符
struct date *pDate=&today;
结构作为函数参数(与数组不同)
-
int numberofdays(struct date d)
-
整个结构可以作为参数的值传入函数。,此时是在函数内新建一个结构变量,并复制调用的值
-
也可以返回一个结构