字符数组
char word []={'H' ,'e' ,'l' ,'l' ,'o','!'};
word[0] H
wors[1] e
word[2] l
word[3] l
word[4] o
word[5] !
字符数组不是字符串
字符串为
char word []={'H' ,'e' ,'l' ,'l' ,'o','!','\0'};
word[0] H
wors[1] e
word[2] l
word[3] l
word[4] o
word[5] !
word[6] \0
字符串
以及0(整数0)结尾的一串字符
0和'/0'是一样的,但是和'0'不同
0标志字符串的结束,但它不是字符串的一部分
计算字符串长度的时候不包括这个0
字符串以数组的形式存在,以数组或指针的形式访问
更多的是以指针的形式
sring.h 里有很多处理字符串的函数
字符串常量
如 "hello"
"hello"会被编译器变成一个字符数组放在某处,这个数组的长度是6,结尾还有表示结束的0
c语言的字符串是以字符数组的形式存在的
不能运用运算符对字符串做运算
可以通过数组的方式遍历字符串
唯一特殊的地方是字符串表面量可以用来初始化字符数组
标准库提供了一些字符函数
char * s ="hello,world";
s是一个指针,初始化为一个字符串常量
由于这个常量所在到地方,所以实际上s是const char *s,但编译器不接收带const的写法
如果对s所在的字符串做写入会导致严重后果
指针无法定义字符串
如果要修改字符串可以使用数组
char * str ="hello,";
char world[] ="hello,";
数组:
这个字符串在这里
作为本地变量空间自动被回收
指针:
这个字符串不知道在哪里
处理参数
动态分配空间
字符串可以表示为 char* 的形式
char*不一定是字符串
其本意是指向字符的指针,可能指向的是字符的数组(就像int*一样)
只有当它所指的字符数组的有结尾的0的时候,才可以说它所指的是字符串
字符串的输入输出
char string[8];
scanf ("%s",string);
printf ("%s",string);
scanf 读入一个单词(到空格,tab或回车为止)
scanf并不是安全的,因为不知道要读入的内容的长度
安全的输入
char string[8];
scanf("%7s",string);
在%和s之间的数字表示最多允许读入的数量,这个数字应该比数组的大小小一
常见的错误
chat*string;
scanf("%7s",string);
以为char*是字符串类型,定义了一个字符串类型变量string就可以直接使用了
由于没有对string初始化为0,所以不一定每一次运行都出错
空字符串
char buffer[100]=" ";
这是一个空字符串,buffer[0]=='\0'
char buffer[]=" ";
这个数组的长度只有1
char a[][10]
即有若干行,每一行有10个字符的位置
char *a[10]
有若干行,每一行指向一个地址
char**a
a是一个指针,指向另一个指针,那个指针指向一个字符(串)
程序参数
int main(int argc,char const *argv[])
argv[0]是命令本身
当使用Unix的符号链接时,反应符号链接的名字
int putchar(int c);
向标准输出写一个字符
返回写了几个字符,EOF(-1)表示写失败
i
int getchar(void);
从标准输入读入一个字符
返回类型是int,是为了返回EOF(-1)
Windows→Ctrl-Z
Unix→Ctrl-D
string.h中包含的函数
strlen,strcmp,strcpy,strcat,strchr,strstr
strlen
size_t strlen(const char*s);
返回s的字符串长度(不包括结尾的0)
strcmp
int strcmp(const char*s1,const char*s2);
比较两个字符串
0:s1==s2
1 s1>s2
-1 s1<s2
strcpy
char * strcpy(char * restrict dst, const *restrict src);
把src的字符串拷贝到dst
restrict表明src和dst不重叠
返回dst是为了能链起来代码
复制一个字符串
char *dst = (char*)malloc(strlen(src)+1);
strcpy(dst, src);
字符串中找字符
char * strchr(const char *s, int c);
char * strrchr(const char *s, int c);
返回NULL表示没有找到
字符串中找字符串
char * strstr(const char *s1, const char *s2);
char * strcasestr(const char *s1, const char *s2);