【C语言】字符串:一串数据类型为字符(char)的数组(字符数组),结束符是'\0'。
一个字符占一个字节的内存,结束符'\0'也占一个字节的内存。
结束符 '\0' :缩写NUL,空字符。表示字符串的结束。
NULL:空指针。定义在标准库中的值为零的常量。
字符串名就是内存地址,也是第一个字符的内存地址。也可以理解为字符串是指针,指向字符数组。
单个字符:用单引号,例如:'a', '\0'。
空字符串或多个字符组成的字符串:用双引号,例如:"good"。
操作字符串(字符数组)的标准库为string.h。
#include <string.h>
0、字符串变量
数组:char 变量名[字符数量] = 字符串; 【字符数量可省略,字符数量包括结束符'\0'】
指针:char *指针变量名;
// 字符数组
char s[6] = "hello"; // 5个字符 + 1个结束符'\0'
char s[6] = {'h','e','l','l','o','\0'}; // 单个字符,用单引号
// 指针变量
char *s;
s = "hello";
1、strlen, sizeof
strlen:字符串共有多少个字符(不包括结束符'\0')。
sizeof:字符串共占多少字节内存(包括结束符'\0')。
#include <stdio.h>
#include <string.h>
int main(void)
{
char strings[] = "hello";
int number = strlen(strings);
int size = sizeof(strings);
printf("strings: \"%s\" has %d elements, memory size is %d bytes",strings, number, size);
return 0;
}
// 结果为:
strings: "hello" has 5 elements, memory size is 6 bytes
2、memchr,strchar,strrchr 搜索字符串中的字符
memchr:void *memchr(const void *str, int c, size_t n)
参数:str是指定内存区域,c为要搜索的字符(单个字符,需用单引号),n为要搜索的字节数(指定搜索的内存大小)。
返回:指针,指向第一次出现的字符c的内存地址。若没有,返回NULL。
strchar:char *strchr(const char *str, int c)
参数:str是字符串,c为要搜索的字符(单个字符,需用单引号)。
返回:指针,指向第一次出现的字符c的内存地址。若没有,返回NULL。
strrchr:char *strrchr(const char *str, int c)
参数:str是字符串,c为要搜索的字符(单个字符,需用单引号)。
返回:指针,指向最后一次出现的字符c的内存地址。若没有,返回NULL。
memchr, strchar,strrchr基本用法相同:
1、都可以在字符串中搜索字符。
2、都返回指针,指向搜索到的字符的内存地址。若没有搜索到,返回NULL。
memchr, strchar,strrchr的区别是:
1、memchr有3个参数:指定内存区域,搜索的字符,搜索的字节数。
strchar和strrchr只有2个参数:字符串,搜索的字符。
2、memchr和strchr返回的指针都指向第一次出现字符c的内存地址。
strrchr返回的指针是指向最后一次出现字符c的内存地址。
3、memchr指定搜索的内存大小。
strchar和strrchr都是字符串结束(结束符'\0')就停止搜索。
4、memchr可以搜索任意内存区域的字节。
strchar和strrchr专门搜索字符串中的字符。
// 以 memchr 为例
#include <stdio.h>
#include <string.h>
int main(void)
{
const char strings[] = "hello";
char *s;
s = (char *)memchr(strings, 'l', strlen(strings));
printf("strings=\"%s\", the first \"l\" location is %d\n",strings, s-strings+1);
printf("strings=\"%s\", from the first \"l\" to the end are \"%s\"",strings, s);
return 0;
}
// 结果为:
strings="hello", the first "l" location is 3
strings="hello", from the first "l" to the end are "llo"
补充:strstr (字符串中查找子字符串)
strstr:char *strstr(const char *haystack, const char *needle)
在字符串haystack查找子字符串needle。
返回:若找到,返回指针,指向haystack中第一次出现needle的内存地址。若没有,返回NULL。
#include <stdio.h>
#include <string.h>
int main(void)
{
char strings[] = "hello world wow";
char *s;
s = strstr(strings, "world"); // 找到子字符串
printf("s point to \"%s\"\n",s);
return 0;
}
// 结果为