一.字符数组
-
char word[ ] = {'H','e','l','l','o','!'};
这不是C语言的字符串,因为不能用字符串的方式做计算
1.字符串
-
char word[ ] = {'H','e','l','l','!','\0'};
字符串
1.1字符串
-
以0(整数0)结尾的一串字符
-
0或'\0'是一样的,但是和'0'不同
-
-
0标志字符串的结束,但它不是字符串的一部分
-
计算字符串长度的时候不包括这个0
-
-
字符串以数组的形式存在,以数组或指针的形式访问
-
更多的是以指针的形式
-
-
string.h里有很多处理字符串的函数
3.字符串变量
-
char *str = "Hello";
-
char word[ ] = "Hello";
-
char line[10] = "Hello";
4.1字符串常量
-
"Hello"
-
"Hello"会被编译器变成一个字符数组放在某处,这个数组的长度是6,结尾还有表示结束的0
-
两个相邻的字符串常量会被自动连接起来
C语言的字符串是以字符数组的形态存在的,不能用运算符对字符串做运算,通过数组的方式可以遍历字
-
唯一特殊的地方是字符串字面量可以用来初始化字符数组,以及标准库提供了一系列字符串函数
4.2 字符串常量
char *s = "Hello, world!";
-
s 是一个指针,初始化为指向一个字符串常量,由于这个常量所在的地方,实际上s是
const char* s
,但是由于历史的原因,编译器接受不带const的写法 -
但是试图对s所指的字符串做写入会导致严重的后果
-
如果需要修改字符串,应该用数组:
char s[] = "Hello, world!";
5.字符串用指针还是数组
char *str = "Hello";
char word[] = "Hello";
-
数组:这个字符串在这里。
-
1.作为本地变量空间自动被收回
-
-
指针:这个字符串不知道在哪里。
-
1.处理参数。2.动态分配空间
-
-
字符串可以表达为char*的形式
-
char*不一定是字符串
-
本意是指向字符的指针,可能指向的是字符串的数组(就像int*一样)
-
只有它所指的字符数组有结尾的0,才能说它所指的是字符串
-
二.字符串输入输出
1.字符串赋值?
-
char *t = "title";
-
char *s;
-
s = t;
-
并没有产生新的字符串,只是让指针s指向了t所指的字符串,对s的任何操作就是对t做的
2.字符串输入输出
-
char string[8];
-
scanf("%s", string);
-
printf("%s", string);
-
scanf读入一个单词(到空格,tab或回车为止)
-
scanf是不安全的,因为不知道要读入的内容的长度
3.安全的输入
-
char string[8];
-
scanf("%7s", string);
-
在%和s之间的数字表示最多允许读入的字符数量,这个数字因该比数组的大小小一
4.常见错误
-
char *string;
-
scanf("%s", string);
-
以为char*是字符串类型,定义了一个字符串类型的变量string就可以直接使用了
-
由于没有对string初始化为0,所以不一定每次运行都出错
-
5.空字符串
-
char buffer[100]="";
-
这是一个空的字符串,buffer[0]=='\0'
-
-
char buffer[ ]="";
-
这个数组的长度只有1!
-
三.字符串数组
程序参数
-
int main(int argc,char const *argv[ ])
-
argv[0]是命令本身,当使用Unix的符号链接时,反映符号链接的名字
四.单字符的输入输出
1.putchar
-
int putchar(int c);
-
向标准输出写一个字符
-
返回写了几个字符,EOF(-1)表示写失败
2.getchar
-
int getchar(void);
-
从标准输入读入一个字符
-
返回类型是int,是为了返回EOF(-1) Windows --> Ctrl-Z; Unix --> Ctrl-D
五.字符串函数
1.string.h
-
strlen
-
strcmp
-
strcpy
-
strcat
-
strchr
-
strstr #include <string.h>
strlen
-
size_t strlen(const char* s);
-
返回s的字符串长度(不包括结尾的0)
int mylen(const char* s) { int idx = 0; while (s[idx] != '\0'){ idx++; } return idx; }
strcmp
-
int strcmp(const char *s1,const char *s2);
-
比较两个字符串,返回:
-
0 ———> s1==s2
-
1 ———> s1>s2
-
-1 ———> s1<s2
-
int mycmp(const char* s1, const* s2) { while( *s1 == *s2 && *s1 != '\0'){ s1++; s2++; } return *s1 - *s2; }
strcpy
-
char *strcpy(char *restrict dst,const char *restrict src);
-
把src的字符串拷贝到dst
-
restrict表明src和dst不重叠
-
-
返回dst
-
为了能链起代码来
-
复制一个字符串
char *dst = (char*)malloc(strlen(src)+1); strcpy(dst,src);
char* mycpy(char* dst, const char* src) { char* ret = dst; while( *dst++ = *src++ ); *dst = '\0'; return ret; }
六.字符串搜索函数
1.字符串中找字符
1.char* strchr(const char* s,int c);// 字符串中寻找单个字符第一次出现的位置(从左边数过来)
char* strrchr(const char* s,int c);// 字符串中寻找单个字符第一次出现的位置(从右边数过来)
返回NULL表示没有找到
2.char* strstr(const char *s1,const char *s2);// 寻找一个字符串
char* strcasestr(const char *s1,const char *s2);// 寻找字符串中忽略大小写