自学内容网 自学内容网

C语言从头学68——学习头文件string.h

       在《C语言从头学31》中,我们学习过“与字符串变量相关的几个函数”,已经知道诸如strcpy、strcat、strcmp()、strlen()等函数定义在string.h中。现在,接着学习string.h中的其它一些函数。
一、函数strchr(),strrchr()
       功能:在字符串中查找指定字符。
       使用格式:strchr(参1,参2); //从头向尾查找(正向)
                         strrchr(参1,参2);//从尾向头查找(逆向)
                           参1:字符串指针变量
                           参2:int型字符
       返回值:找到该字符会停止查找并返回指向该字符的指针(char*类型);如果没有找到则返回NULL。
       说明:这两个函数的使用方法相同,只是查找的方向不同。
二、函数strspn(),strcspn()
       功能:用来查找属于(或者不属于)指定字符集合的字符串长度。
       使用格式:strspn(参1,参2) //查找属于指定字符集合的字符
                         strcspn(参1,参2) //查找不属于指定字符集合的字符
                           参1:源字符串
                           参2:指定字符集合
        返回值:a. strspn()从源字符串第一个字符开始查找,当找到不属于指定字符集合的字符时停止并返回此时的字符串长度(不含不属于的那一个);b.  strcspn()也是从参1的第一个字符开始查找,当找到属于指定字符集合的字符时停止查找,并返回此时的字符串长度(不含属于的那一个字符)。以上两个函数条件相反,如始终没有符合条件的,则返回整个字符串长度。
三、函数strpbrk()
       功能:在字符串中搜索指定字符集合的任意一个字符。
       使用格式:strpbrk(参1,参2);
           参1:源字符串
           参2:指定字符集合
       返回值:返回找到的第一个符合条件字符的指针,找不到返回NULL。
四、函数strstr()
       功能:在一个字符串里面查找另一个字符串。
       使用格式:(参1,参2);
           参1:源字符串
           参2:待查子字符串。
       返回值:查找到指向源字符串里面子字符串的指针;找不到返回NULL。
五、函数strtok()
       功能:将字符串按照指定的分隔符分解成系列单元。
       使用格式:strtok(参1,参2);
          参1:待拆分的字符串指针;(参1为NULL时的意义见说明)
          参2:指定的分隔符
      返回值:指向分解出来的第一个单元,没有分解出来的单元时返回NULL。
      说明:
       a. 参1应使用数组形式;使用char*形式可能报错;strtok() 会修改原始字符串,将所有分隔符
      都替换成字符串结尾符号\0,这也是参1要使用数组形式的原因。
       b. strtok函数不是一次性一个句子分解完毕,一次只分解一个单元出来;
       b. 如想继续分解,参1改成NULL后,每调用一次,可分解出下一个单元。
六、函数memchr()
      功能:在内存区域中查找指定字符
      使用格式:memchr(参1,参2,参3);
          参1:指向内存区域的指针(void*)
          参2:要查找的字符(int)
          参3:内存区域的字节长度(size_t)
      返回值:找到后将停止查找,并返回指向该位置的指针。查完指定的字节数仍找不到则返回NULL。
 七、举例程序

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stddef.h>
#include<string.h> 
  //头文件问题有时编译时发现不了,运行时才能发现
int main(void)
{
//实验函数strchr()、strrchr()
    char* s = "Hello World!";
    int c = 'o';
    char* p1 = strchr(s,c); //正向查找
    ptrdiff_t pd1 = p1 - s;
    char* p2 = strrchr(s, c);//反向查找
    ptrdiff_t pd2 = p2 - s;
    if (p1 != NULL)printf("o在正数第%d位\n", (int)pd1);//运行结果:o在正数第4位
    if (p2 != NULL)printf("倒数第%d位也是o\n", (int)strlen(s) - (int)pd2);//运行结果:倒数第5位也是o
//实验函数strspn(),strcspn() <下面使用的s还是"Hello World!">
    char* stdStr = "aeiou"; //元音字母
    int len = strspn(s,stdStr);//查找属于的函数,遇到不属于的停
    printf("strspn返回长度:%d\n", len);//运行结果:strspn返回长度:0
        //分析:第一个字符H即不在“aeiou”中,立即停止查找,故返回0
    len = strcspn(s, stdStr);//查找不属于的函数,遇到属于的停
    printf("strcspn返回长度:%d\n", len);//运行结果:strspn返回长度:1
        //分析:第1个字H不属于,第2个e属于了,故结束查找,返回1
//实验函数strpbrk()(还是使用s="Hello World!",stdStr = "aeiou")
    char* ptr = strpbrk(s,stdStr);
    ptrdiff_t pd = ptr - s;
    printf("找到的字符位置:%d\n",(int)pd);//运行结果:找到的字符位置:1
    printf("解析指针ptr:%s\n", ptr);//运行结果:解析指针ptr:ello World!
//实验函数strstr()
    s = "000123456789";
    stdStr = "345";
    ptr = strstr(s,stdStr);
    pd = ptr - s;
    printf("找到的子字符串位于:%d\n", (int)pd);//运行结果:找到的子字符串位于:5
//实验函数strtok()
    char ss[] = "Hello World is first computer program.";
    char* ret[8];
    ret[0] = strtok(ss," ");//提取第1个词Hello
    printf("s分解出的第1个词:%s\n",ret[0]);
    for (int i = 1; i < 6; i++)
    {
        ret[i] = strtok(NULL, " ");//依次提取2、3、4、5、6等
        printf("s分解出的第%d个词:%s\n",i+1,ret[i]);
        //s分解出的第1个词:Hello
        //s分解出的第2个词:World
        //s分解出的第3个词:is
        //s分解出的第4个词:first
        //s分解出的第5个词:computer
        //s分解出的第6个词:program.
    }
//实验函数memchr()
    char* s = "abcdefghijklmn";
    char* p;
    int c = 'k';
    p = (char*)memchr(s, c, 15);
    ptrdiff_t pd = p - s;
    printf("查找的字符在第%d位\n", (int)pd);//运行结果:查找的字符在第10位
    printf("找到的字符:%c\n", *p);//运行结果:找到的字符:k
    getchar();
    return 0;
}


原文地址:https://blog.csdn.net/m0_72128260/article/details/142861286

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!