1. strlen
size_t strlen(const char *str);
- 功能:计算字符串
str
的长度(不包括结束符'\0'
) - 返回值:返回字符串的长度,返回类型为size_t类型(一种无符号整型)
- 注意事项:str[
strlen(str)
]存储的就是字符结束符
对应strlen而言,如果strlen返回n,那么实际占用字节数应该是n+1(\0的存在也占用一个字节)
但是实际长度仍然是n,因为字符串的长度通常不包括空字符('\0'
)
2. strcpy
char *strcpy(char *dest, const char *src);
- 功能:将源字符串
src
复制到目标字符串dest
- 返回值:返回目标字符串
dest
的指针 - 注意事项:strcpy会将
src
字符串的所有字符(包括结束符'\0'
)复制到dest
中,从而覆盖dest
原有的内容
首先明确未定义行为:如果你试图在字符串操作中访问 '\0'
之后的字符,可能会导致未定义行为,因为字符串默认是以 '\0'
结尾的。访问这些字符可能会导致程序崩溃或产生意外结果
对于strcpy而言,dest原来存储的字符(包括\0)将会被逐个逐个地替换,直到src的\0被替换完为止
如果dest长度大于src,dest剩余的部分不会被清空或修改,仍然保留了调用 strcpy
之前的内容。但这可能导致未定义的行为,如上所述
3. strncpy
char *strncpy(char *dest, const char *src, size_t n);
- 功能:将源字符串
src
的前n
个字符复制到目标字符串dest
- 返回值:返回目标字符串
dest
的指针
strncpy
从 src
开始逐字符复制到 dest
,直到复制了 n
个字符
如果src的长度小于n,那么复制完src后dest后面将填充足够数量的'\0'以确保达到n个字符
假设源字符串是 "abc",长度为 3,n 为 5 结果是:dest = "abc\0\0"
如果src的长度大于或等于 n
,strncpy
将只复制前 n
个字符,并不会在目标字符串的末尾添加 '\0'
。这意味着目标字符串可能不是以 '\0'
结尾的有效 C 字符串
接下来跳过strcat
5. strncat
char *strncat(char *dest, const char *src, size_t n);
- 功能:将
src
的前n
个字符追加到目标字符串dest
的末尾(从dest的\0开始,\0也将被覆盖) - 返回值:返回目标字符串
dest
的指针
- 如果
src
的长度小于n
,strncat
会将整个src
字符串复制到dest
,并在末尾添加'\0'
- 如果
src
的长度大于或等于n
,则只会复制n
个字符,并在dest
的末尾添加'\0'
6. strncmp
和strcmp类似
7. str
chr
char *strchr(const char *str, int c);
//c:要查找的字符,注意它是以 int 类型传递,但实际上是一个字符
- 功能:查找字符
c
在字符串str
中第一次出现的位置 - 返回值:返回指向该字符的指针,如果未找到则返回
NULL
int main() { char ch[100] = "asdfg"; char a= 'f'; printf("%d",strchr(ch,a) - ch); return 0; }
切记,不要写成char a[10]= 'f';
单字符,如果用字符数组表示就用不了strchr了
做减法,返回的是f里ch数组中第一次出现的下标值
8. str
rchr
char *strrchr(const char *str, int c);
- 功能:查找字符
c
在字符串str
中最后一次出现的位置 - 返回值:返回指向该字符的指针,如果未找到则返回
NULL
0. strstr
char *strstr(const char *haystack, const char *needle);
- 功能:查找字符串
needle
在字符串haystack
中第一次出现的位置 - 返回值:返回指向该位置的指针,如果未找到则返回
NULL
int main() { char ch[100] = "asdfg"; char a[10] = "df"; printf("%d", strstr(ch, a)-ch); return 0; }
strstr(ch, a)-ch
两个指针做减法,strstr(ch,a)还大些,所以是它减ch
注意:前面的返回类型都是指针!所以是地址,那么做减法才能得到对应的下标值
字符串要注意的事项:
字符数组str[某]=“\0”而不是单引号
str[某][某]='\0'而不是双引号
字符串的比较用strcmp或者strcmp,而不是==和!=
!=
和==运算符比较的是指针的地址,而不是字符串的内容,只有在单字符比较时才可用(这时等价于具体的变量,此时[]相当于解引用)
//如果两种相等为if语句判断条件,用!strcmp(a,b)
Comments NOTHING