字符串
基本概念
字符串是位于双引号中的字符序列,因此在内存中以“\0”结束,所占字节比实际多一个。
(‘\0’是字符串结束的标志,因此数组中没有‘\0’时只是字符数组,且元素中间不能出现’\0’)
初始化
当数组元素个数大于存储字符内容时, 未被初始化的部分默认值是0。
1 | char name[] = "c\0ool"; |
- 注意点:
- 对一个字符串数组, 如果不做初始化赋值, 必须指定数组长度;
- 字符串数组最后一个字符的位置要留给字符串的结尾标示‘\0’;
- 当用scanf函数输入字符串时,字符串中不能含有空格,否则将以空格作为串的结束符。
正确的赋值方法:
1 | char str[10]="string"; |
错误的赋值方法:
1 | char str[10]; |
※常用函数※
使用字符串函数应包含头文件”string.h”
(1)输出函数
- 格式: puts(字符数组名)
功能:把字符数组中的字符串输出到显示器。即在屏幕上显示该字符串。
优点:
- 自动换行;
- 可以是数组的任意元素地址。
- 缺点
- 不能自定义输出格式
1 | char ch[] = "dhk"; |
当使用printf且输出格式为&s时,输出项直接为数组名,而不是数组元素
1
2
3char s[10]="dhk";
printf("%s",s);//正确
printf("%s",s[0]);//错误
(2)输入函数
- 格式: gets (字符数组名)
- 功能:从标准输入设备键盘上输入一个字符串。
当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。这是与scanf函数不同的。
- 若要使用scanf一个字符串类型,则需要注意scanf会自动把空格当作分隔符
(3)计算长度
1.sizeof()
数值包含’\0’,且当对象为字符串数组时,计算的是整个数组分配空间的长度
2.strlen()
测量字符串实际长度,不包含;\0’。
(4)连接函数
- 格式: strcat(字符数组名1,字符数组名2) /strncat(~,~,num);
- 功能:把字符数组2中的字符串连接到字符数组1 中字符串的后面,并删去字符串1后的串标志 “\0”。本函数返回值是字符数组1的首地址。
(5)比较函数
格式: strcmp(字符数组名1,字符数组名2)
功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。
- 字符串1=字符串2,返回值=0;
- 字符串1>字符串2,返回值1;
- 字符串1<字符串2,返回值-1。
需要注意的是,比较顺序是从左至右依次比较每一个字符的ASCII码大小,只要出现不同字符就只按照当前字符大小比较,与之后字符大小就无关了。
1
2
3
4
5
6
7
8
9
int main(){
char str1[10] ="acb";
char str2[10] ="abc";
printf("%d\n", strcmp(str1,str2));
//输出1,由于'c'>'b',与第三个及以后的字符大小无关
return 0;
}感觉不是很好用,就拿来比较是否相同就行。
(6)拷贝函数
- 格式: strcpy(char dest,char src); / strncpy(char dest,const char src,size_t num);
- 功能:将参数src字符串拷贝至参数dest所指的地址。
- 返回值:返回参数dest的字符串起始地址。
1 |
|
strcpy会覆盖原来的整个字符串,而strncpy只会覆盖n个字节原来的字符串,剩下的保留(当n超长时应该是默认使用strcpy)
(7)检索函数
1. char strstr(const char str,const char* substr)
功能:检索子串在字符串中首次出现的位置。
返回值:返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回NULL。
2. char strchr(const char str,char c)
功能:查找字符串中第一次出现c的位置。
返回值:规律同strstr()。
3. char strrchr(const char str,char c)
功能:查找字符串中最后一次出现c的位置。
返回值:同上。
(8)其余函数
字符转换
1 | int tolower(int c):转化字符为小写字母; |
整型转换
1 | int atoi(const char* str) |
返回转换后的整型数。
字符串大小写转换
1 | strlwr(const char* str);//转小写 |