前言
过了指针这个坎后,下一步就是C语言中关于字符的处理,这一期来讲讲常用字符函数和字符串函数:strlen,strcpy,strcat,memcpy,memmove,memcmp 等。
目录
Part1:写在前面
Part2:函数介绍
1.strlen
2.strcpy
3.strcat
4.strcmp
5.strncpy
6.strncat
7.strncmp
8.strstr
9.strtok
10.memcpy
11.memmove
12.memcmp
正文
Part1:写在前面
说到字符串大家应该不陌生了,但你知道如何处理字符串吗?
C 语言中对字符和字符串的处理很是频繁,但是 C 语言本身是没有字符串类型的(在C++中解决了这个问题,引入了string类),字符串通常放在常量字符串中或者 字符数组 中。
字符串常量 适用于那些对它不做修改的字符串函数 .
Part2:函数介绍
1.strlen
https://legacy.cplusplus.com/reference/cstring/strlen/?kw=strlen
size_t strlen ( const char * str );
这个函数是获取字符串长度的,下面是注意的点:
• 字符串已经 '\0' 作为结束标志, strlen 函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' );
• 参数指向的字符串必须要以 '\0' 结束;
• 注意函数的返回值为 size_t ,是无符号的。
可以利用此函数来比较两个字符串的大小:
#include<stdio.h> #include<string.h> int main() { const char* str1 = "abcdef"; const char* str2 = "ggg"; if (strlen(str2) - strlen(str1) > 0) { printf("str2>str1\n"); } else { printf("srt1>str2\n"); } return 0; }
👁️🗨️运行结果:
2.strcpy
https://legacy.cplusplus.com/reference/cstring/strcpy/?kw=strcpy
char* strcpy(char * destination, const char * source );
这个函数是用来拷贝字符串的
注意传参:将后部的字符串拷贝到前部的空间中
• 源字符串必须以 '\0' 结束;
• 会将源字符串中的 '\0' 拷贝到目标空间;
• 目标空间必须足够大,以确保能存放源字符串;
• 目标空间必须可变。
例子:
#include<stdio.h> #include<string.h> int main() { char str1[40]; const char* str2 = "abc"; char* str = strcpy(str1, str2); printf("%s\n", str); return 0; }
👁️🗨️运行结果:
3.strcat
https://legacy.cplusplus.com/reference/cstring/strcat/?kw=strcat
char * strcat ( char * destination, const char * source );
这个函数是在一个字符串末尾追加字符串的
• 源字符串必须以 '\0' 结束;
• 目标空间必须有足够的大,能容纳下源字符串的内容;
• 目标空间必须可修改。
例子:
#include<stdio.h> #include<string.h> int main() { char str[80]; strcpy(str, "these "); strcat(str, "strings "); strcat(str, "are "); strcat(str, "concatenated."); puts(str); // 输出字符串,传递char*类型,遇到\0结束 return 0; }
👁️🗨️运行结果:
4.strcmp
https://legacy.cplusplus.com/reference/cstring/strcmp/?kw=strcmp
int strcmp ( const char * str1, const char * str2 );
这个函数的作用就是比较两个字符串的
标准规定:
• 第一个字符串大于第二个字符串,则返回大于0的数字;
• 第一个字符串等于第二个字符串,则返回0;
• 第一个字符串小于第二个字符串,则返回小于0的数字。
注意注意:不是比较字符串的长度,而是一个字符一个字符地比较字符的 ASCII 码值
例子:
#include<stdio.h> #include<string.h> int main() { char* str1 = "abcdef"; char* str2 = "abcdef"; char* str3 = "abcde"; char* str4 = "cpp"; printf("%d\n", strcmp(str1, str2)); printf("%d\n", strcmp(str1, str3)); printf("%d\n", strcmp(str1, str4)); // 第一个字符就小 return 0; }
👁️🗨️运行结果:
其实这个函数的最大作用就是0的情况,即判断两个字符串相等。
5.strncpy
https://legacy.cplusplus.com/reference/cstring/strncpy/?kw=strncpy
char * strncpy ( char * destination, const char * source, size_t num );
这个函数也是拷贝字符串的,不过它相比 strcpy 多了一个参数 num ,说明可以指定拷贝字符串的字符个数。
• 拷贝 num 个字符从源字符串到目标空间;
• 如果源字符串的长度小于 num ,则拷贝完源字符串之后,在目标的后边追加 0 ,直到 num 个。
例子:
#include<stdio.h> #include<string.h> int main() { char str1[40] = { '0' }; char str2[30] = { '0' }; const char* str3 = "abcdef"; strncpy(str1, str3, 6); strncpy(str2, str3, 2); printf("%s\n", str1); printf("%s\n", str2); return 0; }
👁️🗨️输出结果:
6.strncat
https://legacy.cplusplus.com/reference/cstring/strncat/?kw=strncat
这个函数也是,加了 n ,可控制要追加的字符长度
• 追加字符,
例子:
#include <stdio.h> #include <string.h> int main() { char str1[20]; char str2[20]; strcpy(str1, "To be "); str1 中存入 To be strcpy(str2, "or not to be"); str2 中存入 or not to be strncat(str1, str2, 6); str1 追加 str2 中的6个字符 or no puts(str1); return 0; }
👁️🗨️输出结果:
7.strncmp
https://legacy.cplusplus.com/reference/cstring/strncmp/?kw=strncmp
int strncmp ( const char * str1, const char * str2, size_t num );
相比 strcmp,它可以指定最多比较 num 个字符
• 比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
例子:
#include <stdio.h> #include <string.h> int main() { char str[][5] = { "R2D2" , "C3PO" , "R2A6" }; int n; puts("Looking for R2 astromech droids..."); for (n = 0; n < 3; n++) { if (strncmp(str[n], "R2xx", 2) == 0) printf("found %s\n", str[n]); } return 0; }
👁️🗨️输出结果:
这个例子的意思就是在 str 中寻找含有 R2 的字符串。