目录
一、关于<string.h>的介绍
配合上一篇食用>关于<string.h>那些事 ------《mem系列函数使用》<
str系列的函数应该算是<string.h>的主力军了,正如同它的名字一样string(字符串),str系列的函数是专门为字符串服务的,以至于连函数接受的参数都是字符串。
其实<string.h>真正上还应有strn系列的函数(就是str系列函数的升级版),它可以接收出字符串之外的参数,但<string.h>中只给出了三个函数(后面会说明),所以这里把它们归为了另一类
二、<string.h>的str系列函数使用
2.1 strcat()
函数&描述 | |
---|---|
strcat() | char *strcat(char *str1, const char *str2) 把 strr2 所指向的字符串追加到 str1 所指向的字符串的结尾。 |
对于以上的函数原型里出现了:char *strcat() 、const 、char *str1 、char *str2 ;
char *strcat() :定义一个字符型指针的strcat函数(函数内对str1进行修改并自身作为一个指针返回)
const :表示安全标识,表示只读不修改
void *str1 :从传入的是一个字符类型str1指针指向要执行搜索的内存块
void *str2 :从传入的是一个字符类型str2指针指向要执行搜索的内存块
使用实例:
#include<stdio.h>
#include<string.h>
main()
{
char str1[10]="hello";
char str2[10]=" world!";
printf("%s\n",strcat(str1,str2));
//运行结果表示strcat返回了一个指针
//可以直接printf出来
printf("%s\n",str1);
//并且strcat也改变了str1内值
//还是老毛病,明显str1已经超出了所定义的范围但是c语言并没有截断
}
2.2 strncat()
函数&描述 | |
---|---|
strncat() | char *strncat(char *str1, const char *str2, size_t n 把 str2 所指向的字符串追加到 str1 所指向的字符串的结尾,直到 n 字符长度为止。 |
对于以上的函数原型里出现了:char *strncat() 、const 、char *str1 、char *str2 ;
char *strncat() :定义一个字符型指针的strncat函数(函数内对str1进行修改并自身作为一个指针返回)
const :表示安全标识,表示只读不修改
char *str1 :从传入的是一个字符类型str1指针指向要执行搜索的内存块
char *str2 :从传入的是一个字符类型str2指针指向要执行搜索的内存块
size_t n :要被分析的字节数
使用实例:
#include<stdio.h>
#include<string.h>
main()
{
char str1[10]="hello";
char str2[10]=" world!";
printf("%s\n",strncat(str1,str2,7));
printf("%s\n",str1);
}
strcat和strcnat几乎一模一样,最本质的截断问题还是没解决,只不过strncat加了个可以控制把str2的前n个字符追加给str1
2.3 strchr()
函数&描述 | |
---|---|
strchr() | char *strchr(const char *str, int c) 在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。 |
char *strchr() :定义一个字符型指针的strchr函数(函数内并没有对str1进行修改,只是自身作为一个指针返回)
const :表示安全标识,表示只读不修改
char *str :从传入的是一个字符类型str1指针指向要执行搜索的内存块
int c :以 int 形式传递的值,但是函数在每次字节搜索时是使用该值的无符号字符形式
使用实例:
#include<stdio.h>
#include<string.h>
main()
{
char str[]="hello world";
char c='e';
char *p1=strchr(str,c);
char *p2=strchr(str,'i');
//strchr接受的c是一个无符号字符
printf("%s\n",p1);
//运行结果表示strchr自身作为一个字符指针返回从c往后的字符
printf("%s\n",str);
//strchr并没有改变str内的值
printf("%s",p2);
//str中无i元素,所以返回一个(null)
}
*注:(null)是一个空指针,只代表“空”的意义(也就是无意义),可以被换行符抵消
2.4 strcmp()
函数&描述 | |
---|---|
strcmp() | int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较。 |
对于以上的函数原型里出现了:char *strcmp() 、const 、char *str1 、char *str2 ;
int strcmp() :定义一个整型strcmp函数(说明此函数的返回值是一个整型)
const :表示安全标识,表示只读不修改
char *str1 :从传入的是一个字符类型str1指针指向要执行搜索的内存块
char *str2 :从传入的是一个字符类型str2指针指向要执行搜索的内存块
#include<stdio.h>
#include<string.h>
main()
{
char str1[]="hello world";
char str2[]="Hello World!";
int ret=strcmp(str1,str2);
printf("%d\n",ret);
printf("%d\n",strcmp(str1,"how"));
printf("%d\n",strcmp(str1,str1));
//运行结果表示strcmp是将str内的字符所对应的ASCII
//str1>str2 -> return 1;
//str1=str2 -> return 0;
//str1<str2 -> return -1;
}
2.5 strncmp()
函数&描述 | |
---|---|
strncmp() | int strncmp(const char *str1, const char *str2, size_t n) 把 str1 和 str2 进行比较,最多比较前 n 个字节。 |
int strncmp() :定义一个整型strncmp函数(说明此函数的返回值是一个整型)
const :表示安全标识,表示只读不修改
char *str1 :从传入的是一个字符类型str1指针指向要执行搜索的内存块
char *str2 :从传入的是一个字符类型str2指针指向要执行搜索的内存块
size_t n :要被分析的字节数
#include<stdio.h>
#include<string.h>
main()
{
char str1[]="hello world";
char str2[]="Hello World!";
int n=12;
int ret=strncmp(str1,str2,n);
printf("%d\n",ret);
printf("%d\n",strncmp(str1,"how",n));
printf("%d\n",strncmp(str1,str1,n));
//运行结果表示strncmp是将str内的字符所对应的ASCII进行比较
//与strcmp不同的是:
//strcmp是将str内的字符所对应的ASCII进行比较,返回值是-1、0、1
//strncmp是str内的字符所对应的ASCII进行相减,返回值是相减后的ASCII
}
2.6 strcoll()
函数&描述 | |
---|---|
strcoll | int strcoll(const char *str1, const char *str2) 把 str1 和 str2 进行比较,结果取决于 LC_COLLATE 的位置设置。 |
strcoll的比较方式是取决于LC_COLLATE,而在c语言中strcoll的比较方式与strcmp一模一样,因为这篇文章主要以c语言为主,所以在这里就不多描述了
三、总结
mem系列函数和str系列函数中有许多的相似之处,所以可以配合上一篇食用
>关于<string.h>那些事 ------《mem系列函数使用》<
str系列函数总共有17个,所以我将把它们分为三篇文章讲述,在《关于<string.h>那些事》系列结束后我会进行一次汇总,排一下序,使文章看起来不是那么的乱
如果有什么问题或我描述不清可以给我留言、评论