C库提供了多个处理字符串的函数,ASCII把这写函数放在string.h头文件中,其中最常见的函数有strlen()、strcmp()、strcpy()、strcat()、strncat()、strncpy()、strncmp,还有sprintf()。
1.strlen()函数
strlen()函数用于统计字符串的长度,遇到‘\0’结束。
#include <stdio.h>
#include <string.h>
int main(void){
char ch1[10]="hello"
char ch2[10]={'a','b','v','g','s','\0','a','\0'};
printf("ch1=%ld,ch2=%ld\n",strlen(ch1),strlen(ch2));//输出ch1=5,ch2=5
return 0;
}
2.strcat()函数
strcat(char* dest, const char* src);dest是目标字符串的指针,src是源字符串的指针。strcat()是将src指向的字符串复制到dest指向的字符串末尾,并确保字符串以'\0'结束,要注意“dest”必须有足够的空间来容纳附加的字符串,包括空终止符。如果没有足够的空间,可能会导致缓冲区溢出,这是一种常见的安全问题。
3.strncat()函数
strncat(char* dest, const char* src, size_t num);是将src指向的字符串复制到dest指向的字符串末尾。这里 `dest` 是目标字符串的指针,`src` 是源字符串的指针,`num` 是要从 `src` 中复制的最大字符数(不包括空终止符)。
如果 `num` 大于源字符串的实际长度,`strncat()` 仅复制源字符串的全部内容,并在末尾添加一个空字符。
如果 `num` 等于源字符串的实际长度,`strncat()` 会复制源字符串的所有字符,但不会添加额外的空字符,因为 `destination` 已经有一个空字符。
如果 `num` 小于源字符串的实际长度,`strncat()` 会在复制 `num` 个字符后停止,并在末尾添加一个空字符。
4.strcmp()函数
strcat(char* dest, const char* src);dest是目标字符串的指针,src是源字符串的指针。这里 `dest` 和 `src` 分别是指向待比较的两个字符串的指针、区分大小写。`strcmp()` 函数返回一个整数值,该值表示两个字符串之间的关系:
如果 `dest` 和 `src` 相同,则返回 0。
如果 `dest` 在ASCII顺序上小于 `src`,则返回负数-1,但是在C99之后返回值为俩ASCII码之差。
如果 `dest` 在字典顺序上大于 `src`,则返回正数1,但是在C99之后返回值为俩ASCII码之差。
char s1[20]="hello";
char s2[20]="Hello";
char s3[20]="hello";
printf("strcmp(s1,s2)=%ld",strcmp(s1,s2)=%ld)//32
printf("strcmp(s2,s1)=%ld",strcmp(s2,s1)=%ld)//-32
printf("strcmp(s1,s3)=%ld",strcmp(s1,s3)=%ld)//0
5.strncmp()函数
strncmp(const char* str1, const char* str2,size_t n),这里 `str1` 和 `str2` 分别是指向待比较的两个字符串的指针,`n` 是要比较的字符数,比较字符串str1和str2前n个字符是否相同,区分大小写。strncmp()` 函数返回一个整数值,该值表示两个字符串之间的关系:
如果前n个相同,则返回 0。
如果 `str1` 前n个在ASCII顺序上小于 `str2`前n个,则返回负数-1,但是在C99之后返回值为俩ASCII码之差。
如果 `str1` 前n个在ASCII顺序上大于 `str2`前n个,则返回正数1、但是在C99之后返回值为俩ASCII码之差。
char s1[20]="hello";
char s2[20]="Hell";
char s3[20]="hel";
printf("strncmp(s1,s2,3)=%ld",strcmp(s1,s2)=%ld)//32
printf("strncmp(s2,s1,3)=%ld",strcmp(s2,s1)=%ld)//-32
printf("strncmp(s1,s3,2)=%ld",strcmp(s1,s3)=%ld)//0
6.strcpy()函数
char* strcpy(char* dest, const char* src),这里 `dest` 是目标字符串的指针,`src` 是源字符串的指针。 `strcpy()` 函数会将 `src` 指向的字符串(包括空终止符)复制到 `dest` 指向的位置、从dest的'\0'位置开始。复制完成后,`dest` 也将以空字符 `\0` 结束。
strcpy() 不检查目标缓冲区的大小,因此如果目标缓冲区太小,可能会导致未定义行为或安全漏洞。 如果 `src` 字符串比 `dest` 缓冲区长,`strcpy()` 会继续复制直到遇到空终止符,这可能导致 `dest 缓冲区溢出。
char s1[20]="hello";
char s2[20]="word";
char s3[5]="Days";
strcpy(s1,s2);
strcpy(s3,s1);
puts(s1);//helloword
puts(s3);//Dayshello
7.strncpy()函数
char* strncpy(char* dest, const char* src,size_t n),strncpy()用于将一个字符串的前 n 个字符复制到另一个字符串。'dest' 是目标字符串的指针,`src` 是源字符串的指针,`n` 是要从 `src` 中复制的最大字符数(不包括空终止符)
如果 `n` 大于源字符串的实际长度,`strncpy()` 仅复制源字符串的全部内容,并在末尾添加一个空字符。
如果 `n` 等于源字符串的实际长度,`strncpy()` 会复制源字符串的所有字符,但不会添加额外的空字符,因为 `dest 已经有一个空字符。
如果 `n` 小于源字符串的实际长度,`strncpy()` 会在复制 ‘n’ 个字符后停止,并在末尾添加一个空字符。
char s1[20]="hello";
char s2[20]="word";
char s3[5]="Days";
strncpy(s1,s2,10);
strncpy(s3,s1,1);
puts(s1);//helloword
puts(s3);//Daysh
多维数组
二维数组表示: 类型说明符 数组名[常量表达式1][常量表达式2]。
n维数组表示: 类型说明符 数组名[常量表达式1][常量表达式2]....[常量表达式n]。
n维数组存储方式先按行存储的,都可以看成n-1维数组类型的一维数组组成的,n-1维数组可以由n-2维数组类型的一维数组组成的。最终可以了解维有n个一维数组构成n维数组。
这里以二位数组为例说明多维数组;通过多重for循环遍历其中的每个数据。
初始化:
int a[3][3];
a[3][3]={1,2,3,4,5,6,7,8,9};//全部初始化
a[3][3]={{1,2,3},{4,5,6},{7,8,9}};//全部初始化
a[3][3]={{1,2},{4,5},{7,8}};//部分初始化,剩下补0
a[3][3]={};//初始化为0