C语言中的"string.h"

strlen求字符串长度

strcmp比较2个字符串是否一样

strcat字符串连接操作

strcpy字符串拷贝操作

strncat字符串连接操作(前n个字符)

strncpy字符串拷贝操作(前n个字符)

strchr查询字串

strstr 查询子串

1. strlen求字符串长度

功能:strlen函数求的是字符串的长度

它求得方法是从字符串的首地址开始到遇到第一个'\0'停止计数

如果你只定义没有给它赋初值,这个结果是不定的,它会从字符串首地址一直记下去,直到遇到'\0'才会停止。

原型:size_tstrlen(const char *s);

#include <stdio.h>
#include <string.h>
int main()
{
    int i = 0;
    char *tmp1 = "Hello,world";
    // https://jeremybai.github.io/blog/2014/09/10/size-t
    //在这里出现警告,有size_t(aka unsigned long)
    //这是size type等价于最大的整形,用于提高代码移植性
    //本句中返回11,不包括字符串末尾的'\0'字符,只返回有效位的长度
    printf("%d\n", strlen(tmp1));

    char *tmp2 = NULL;
    //下面这一句会出错,因为不能返回NULL的长度
    //printf("%d\n", strlen(tmp2));

    char *tmp3;
    //下面这一句中返回的是随机长度
    printf("%d\n", strlen(tmp3));
    return 0;
}

2. strcmp比较2个字符串是否一样

功 能:串比较

看Asic码,str1>str2,返回值 > 0;两串相等,返回0

用 法:int strcmp(char *str1, char *str2);

#include <string.h>
#include <stdio.h>
int main()
{
    char *buf1 = "aaaaaaaaa", *buf2 = "aad", *buf3 = "ccc";
    printf("%d\n", strcmp(buf2, buf1));
    printf("%d\n", strcmp(buf2, buf2));
    printf("%d\n", strcmp(buf2, buf3));
    return 0;
}
/*
3
0
-2
*/
//由结果可知strcmp是类似于字典形式的比较
//其返回值是
//第一次出现差别的两个字符的ASCII码之差

3. strcat字符串连接操作

功 能:字符串拼接函数

strcat---string catenate

用 法:char *strcat(char *destin, char *source);

注意,strcat的第一项中,必须是一个有分配好空间的数组名

#include <string.h>
#include <stdio.h>
int main()
{
    char destination[25];
    char *blank = " ", *c = "C++", *Borland = "Borland";
    printf("%d\n", strlen(destination));
    strcpy(destination, Borland);
    printf("%d\n", strlen(destination));
    strcat(destination, blank);
    printf("%d\n", strlen(destination));
    strcat(destination, c);
    printf("%d\n", strlen(destination));
    printf("%s\n", destination);
    return 0;
}
/*
5               这里是一个随机值
7               "Borland"的长度
8               "Borland "的长度
11              "Borland C++"的长度
Borland C++     打印出了该字符
*/

4. strcpy字符串拷贝操作

功 能:拷贝一个字符串到另一个

注意:这种拷贝是完全的覆盖,就算之前的字符串大于现有的,也会提前写入结束标志符'\0'

用 法:char *strcpy(char *destin, char *source);

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
    char string[10];
    char *str1 = "Hello!";
    char *str2 = (char *)malloc(sizeof(char) * 10);
    strcpy(string, str1);

    //若str2没有预先分配空间
    //则下面这一句中出现错误提示"Bus error: 10"
    //所以strcpy的前一位一定要是有分配空间的
    strcpy(str2, str1);

    printf("%s\n", string);
    printf("%s\n", str2);
    return 0;
}
/*
Hello!
Hello!
*/

5. strncat字符串连接操作(前n个字符)

功能:将src的前n个字符给复制到dest的末尾

用法:char * strncat(char *dest, const char *src, size_t n);

#include <stdio.h>
#include <string.h>
int main()
{
    char dest[20] = "Hello ";
    char src[20] = "World For U";
    
    //strncat用于将src的前5位
    //给复制到dest的末尾
    strncat(dest, src, 5);
    
    printf("%s\n", dest);
    return 0;
}
/*
Hello World
*/

6. strncpy字符串拷贝操作(前n个字符)

功能:将前n个字符复制到目标指针数组中

用法:char *strncpy(char *destinin, char *source, int maxlen);

#include <stdio.h>
#include <string.h>
int main()
{
    char name1[] = "Chinanet", name2[] = "This is the best day ever.";
    char destin[30] = "I am so mad.";
    strncpy(destin, name1, 3);
    printf("%s\n", destin);
    strncpy(destin, name2, 29);
    printf("%s\n", destin);
}
//由如下结果可以看出,复制前n个字符的时候
//如果n个字符以内没有遇到结束符'\0',则不添加结束符
//如说在n个字符以内,遇见过结束符
//则在最末尾额外添加结束符
/*
Chim so mad today.
This is the best day ever.
*/

7. strchr和strrchr从串中查询字

功 能:在串中查找指定字符的第一个/最后一个出现的指针位置

chr表示character,而中间多出的r表示reverse

用 法:

char *strchr(char *str, char c);

char *strrchr(char *str, char c);

#include <string.h>
#include <stdio.h>
int main()
{
    char string[20];
    char *ptr1, *ptr2, c = 'i';
    strcpy(string, "This is a string.");
    ptr1 = strchr(string, c);
    if (ptr1)
    {
        printf("Use strchr:\n");
        printf("For \"%s\"\n", string);
        printf("The character %c is at position: %d\n",
               c, ptr1 - string);
    }
    else
        printf("The character was not found!\n");
    ptr2 = strrchr(string, c);
    if (ptr2)
    {
        printf("Use strrchr:\n");
        printf("For \"%s\"\n", string);
        printf("The character %c is at position: %d\n",
               c, ptr2 - string);
    }
    else
        printf("The character was not found!\n");
    return 0;
}
/*
Use strchr:
For "This is a string."
The character i is at position: 2
Use strrchr:
For "This is a string."
The character i is at position: 13
*/

8. strstr查询子串

功 能:第一次出现的子串位置

用 法:char *strstr(char *str1, char *str2);

#include <stdio.h>
#include <string.h>
int main()
{
    char *str1 = "The hat on the cat is flat.", *str2 = "at";
    char *ptr;
    ptr = strstr(str1, str2);
    if (ptr)
    {
        printf("Use strstr:\n");
        printf("For \"The hat on the cat is flat.\"\n");
        printf("The position of \"%s\" is %d\n", str2, ptr - str1);
    }
    else
        printf("Not Found!\n");
    return 0;
}
//标准库中不存在strrstr,也即不存在从右往左匹配子串
/*
Use strstr:
For "The hat on the cat is flat."
The position of "at" is 5
*/

借鉴:https://baike.baidu.com/item/string.h/4262091?fr=aladdin

Cpp中的"string"

借鉴:https://blog.csdn.net/samkieth/article/details/50876347

借鉴:王道机试指南P42