写在前面:使用大部分的字符串函数都要包含string.h头文件
一、strlen()函数:该函数用于统计字符串的长度。
二、strcat()函数
1.函数原形:strcat(字符数组名/字符串指针,字符数组名/字符串指针/字符串常量)
2.用法:strcat()函数用于拼接字符串,函数接受两个字符串作为参数,把第2个字符串的备份附加在第1个字符串的末尾,并把拼接后形成的新字符串作为第1个字符串,第2个字符串不变;strcat()函数返回第1个参数,即拼接第2个字符串后的第1个字符串的首地址。
3.延伸:由于strcat()函数无法检查第1个数组是否能容纳第2个字符串而可能导致数组元素溢出问题,所以引入含有三个参数的strncat()函数,该函数的第3个参数指定了最大添加字符数。
三、strcmp()函数
1.函数原形:strcmp(“string1”,“string2”)或strcmp(字符数组首地址,字符数组首地址/字符串常量);该函数比较所有的字符而不只是字母,根据字符的数值(通常使用ASCII值)进行比较。
2.返回值:strcmp()函数比较字符串(不是字符)的不同。如果比较的两个字符串完全相同,函数返回0;如果字母表中第1个字符串位于第2个字符串前面,strcmp()中就返回负数,反之则返回正数,具体的返回值根据编译系统而定。如:
strcmp(“A”,“A”) is 0
strcmp(“A”,“B”) is -1
strcmp(“B”,“A”) is 1
但大多数情况下,函数的具体返回值并不重要,我们只在意该值是0还是为0。
3.延伸:strncmp(字符串1,字符串2,指定比较的字符数)
该函数在比较两个字符串时,可以比较到字符不同的地方,也可以只比较第3个参数指定的字符数。示例代码如下:
#include<stdio.h>
#include<string.h>
#define LISTSIZE 6
int main()
{
const char* list[LISISIZE]=
{
"astronomy","astounding","astrophysics","ostracize","asterism","astrophobia"
};
int count=0;
for(int i=0;i<LISTSIZE;i++)
{
if(strcmp(list[i],"astro",5)==0)
{
printf("Found: %s\n",list[i]);
count++;
}
}
printf("The list contained %d words beginning with astro.\n",count);
return 0;
}
/*程序输出:
Found: astronomy
Found: astrophysics
Found: astrophobia
The list contained 3 words beginning with astro.
*/
四、strcpy()函数
1.函数原形:strcpy(字符串指针1/字符数组名1,字符串指针2/字符数组名2/字符串常量)
2.说明:strcpy()第2个参数指向的字符串被拷贝至第1个参数指向的数组中,拷贝出来的字符串被称为目标字符串,最初的字符串称为源字符串。strcpy()的返回类型是char*,该函数返回的是第1个参数的值,即一个字符的地址,并且第1个参数不必指向数组的开始。如下的示例代码:
#include<stdio.h>
#include<string.h>
#define WORDS "beast"
#define SIZE 40
int main(void)
{
const char* orig = WORDS;
char copy[SIZE]="Be the best that you can be.";
char * ps;
puts(orig);
puts(copy);
ps=strcpy(copy+7,orig);
puts(copy);
puts(ps);
return 0;
}
/*程序输出:
beast
Be the best you can be.
Be the beast
beast
}
3.延伸:使用三个参数的strncpy()函数更安全,该函数弥补了strcpy函数不能检查目标空间是否能容纳源字符串的副本的问题,它的第3个参数指明可拷贝的最大字符数。
五、其他字符串函数(具体实现可上机操作)
1.char * strcpy(char* restrict s1, const char * restrict s2);
该函数把s2指向的字符串(包括空字符)拷贝至s1指向的位置,返回值是s1。
2.char * strncpy(char* restrict s1, const char * restrict s2, size_t n);
该函数把s2指向的字符串拷贝至s1指向的位置,拷贝的字符个数不超过n,其返回值是s1。该函数不会拷贝空字符后面的字符,如果源字符串的字符少于n个,目标字符串就以拷贝的空字符结尾;如果源字符串有n及以上个字符,就不拷贝空字符。
3.char *strcat(char * restrict s1, const char * restrict s2);
该函数把s2指向的字符串拷贝至s1指向的字符串末尾。s2字符串的第1个字符将覆盖s1字符串末尾的空字符。该函数返回s1。
4.char *strncat(char * restrict s1, const char * restrict s2, size_t n);
该函数把s2字符串中的n个字符拷贝至s1字符串末尾。s2字符串的第1个字符将覆盖s1字符串末尾的空字符。不会拷贝s2字符串中空字符和其后的字符,并在拷贝字符的末尾添加一个空字符。该函数返回s1。
5.int *strcmp(const char *s1, const char * s2);
如果s1字符串在机器排序序列中的后面,该函数返回一个正值;如果两个字符串相等,则返回0;如果s1字符串在机器排序序列中位于s2的前面,则返回一个负值。
6.int *strncmp(const char *s1, const char * s2, size_t n);
该函数的作用与strcmp()类似,不同的是,该函数在比较n个字符后或遇到第1个字符时停止比较。
7.char *strchr(const char *s, int c);
如果s字符串中包含字符c,该函数返回指向s字符串首地址的指针(末尾的空字符也是字符串的一部分,所以在查找范围内);如果字符串s中未找到c字符,则返回空指针。
8.char *strpbrk(const char * s1,const char * s2);
如果s1字符串中包含s2字符串中的任意字符,该函数返回指向s1字符串首地址的指针;如果在s1字符串中未找到任何s2字符串中的字符,则返回空字符。
9.char *strrchr(const char * s, int c);
该函数返回s字符串中c字符的最后一次出现的位置(末尾的空字符也是字符串的一部分,所以在查找范围内)。如果未找到c字符,则返回空指针。
10.char *strstr(const char * s1, const char * s2);
该函数返回指向s1字符串中s2字符串出现的首位置。如果在s1中没有找到s2,则返回空指针。
11.size_t strlen(const char * s);
该函数返回s字符串中的字符数,不包括末尾的空字符。