Skip to content

string中的子函数

1、size_t

<string.h> size_t strnlen(const char *str, size_t maxlen);

计算字符串str的(unsigned int型)长度,不包括结束符NULL,该长度最大为maxlen。 即size_t等价于unsigned int

2、std::basic_string<char> str = "haha"

std::basic_string类模板存储且操纵类似char的对象的序列。该对象类型的性质由特性类模板std::char_traits的实例来提供,并作为std::basic_string的第二个模板参数 。

其中string是std::basic_string<T>的简写 。

3、strstr函数

strstr是C语言中的函数,作用是返回字符串中首次出现子串的地址。

3-1、描述

包含文件:string.h 函数名: strstr 函数原型:

extern char *strstr(char *str1, const char *str2);

语法:

* strstr(str1,str2)

str1: 被查找目标 string expression to search. str2: 要查找对象 The string expression to find.

返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL。 例子:

char str[]="1234xyz";
char *str1=strstr(str,"34");
cout << str1 << endl;

显示的是: 34xyz

3-2、实现方式

c
char *strstr(const char *s1,const char *s2)
{
 int len2;
 if(!(len2=strlen(s2)))//此种情况下s2不能指向空,否则strlen无法测出长度,这条语句错误
     return(char*)s1;
 for(;*s1;++s1)
 {
     if(*s1==*s2 && strncmp(s1,s2,len2)==0)
     return(char*)s1;
 }
 return NULL;
}

//常用经典实现方法
char *strstr(const char *str1, const char *str2)
{
    char *cp = (char*)str1;
    char *s1, *s2;
 
    if (!*str2)
        return((char *)str1);
 
    while (*cp)
    {
        s1 = cp;
        s2 = (char *)str2;
 
        while (*s1 && *s2 && !(*s1 - *s2))
            s1++, s2++;
 
        if (!*s2)
            return(cp);
 
        cp++;
    }
    return(NULL);
}

4、判断为空

成员函数empty

string str;
if (str.empty()) {
	//do anything
}

成员函数size

string str;
if (str.size() == 0) {
	//do saomthing
}

与空串比较

string str;
if (str == "") {
	//do something
}

几种方法中,empty函数是效率最高也是最常用的一种。

5、C语言strncasecmp()函数:比较字符串的前n个字符

表头文件:#include <strings.h> 函数定义:int strncasecmp(const char *s1, const char *s2, size_t n) 函数说明:strncasecmp()用来比较参数s1和s2字符串前n个字符,比较时会自动忽略大小写的差异。 返回值:若参数s1 和s2 字符串相同则返回0。s1 若大于s2 则返回大于0 的值,s1 若小于s2 则返回小于0 的值。

表头文件 #include <strings.h>(不是C/C++的标准头文件,区别于string.h) 定义函数 int strcasecmp (const char *s1, const char *s2); strcasecmp用忽略大小写比较字符串.,通过strcasecmp函数可以指定每个字符串用于比较的字符数,strcasecmp用来比较参数s1和s2字符串前n个字符,比较时会自动忽略大小写的差异。 strcasecmp函数是二进制且对大小写不敏感。此函数只在Linux中提供,相当于windows平台的 stricmp。

6、字符串查找

s.find(s1) //查找s中第一次出现s1的位置,并返回(包括0) s.rfind(s1) //查找s中最后次出现s1的位置,并返回(包括0) s.find_first_of(s1) //查找在s1中任意一个字符在s中第一次出现的位置,并返回(包括0) s.find_last_of(s1) //查找在s1中任意一个字符在s中最后一次出现的位置,并返回(包括0) s.fin_first_not_of(s1) //查找s中第一个不属于s1中的字符的位置,并返回(包括0) s.fin_last_not_of(s1) //查找s中最后一个不属于s1中的字符的位置,并返回(包括0)

7、字符串截取

s.substr(pos, n) //截取s中从pos开始(包括0)的n个字符的子串,并返回 s.substr(pos) //截取s中从从pos开始(包括0)到末尾的所有字符的子串,并返回

8、字符串替换

s.replace(pos, n, s1) //用s1替换s中从pos开始(包括0)的n个字符的子串

9、strdup

strdup() 函数是c语言中常用的一种字符串拷贝库函数,一般和 free() 函数成对出现。 strdup()在内部调用了malloc()为变量分配内存,不需要使用返回的字符串时,需要用free()释放相应的内存空间,否则会造成内存泄漏。 返回一个指针,指向为复制字符串分配的空间;如果分配空间失败,则返回NULL值。

demo见:D:\Github\Storage\c++\standard_library\string\strdup_example.cpp

10、strstr函数

strstr是C语言中的函数,作用是返回字符串中首次出现子串的地址。

10-1、简介

包含文件:string.h 函数名: strstr 函数原型:

extern char *strstr(char *str1, const char *str2);

str1: 被查找目标 string expression to search. str2: 要查找对象 The string expression to find. 返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL。

10-2、例子

char str[] = "1234xyz";
char *str1 = strstr(str,"34");
cout << str1 << endl;

显示的是: 34xyz

10-3、实现方式

c
char *strstr(const char *s1, const char *s2)
{
    int len2;
    if (!(len2 = strlen(s2)))   // 此种情况下s2不能指向空,否则strlen无法测出长度,这条语句错误
        return (char*)s1;
    for(; *s1; ++s1) {
        if(*s1 == *s2 && strncmp(s1, s2, len2)==0)
            return (char*)s1;
    }
    return NULL;
}

//常用经典实现方法
char *strstr(const char *str1, const char *str2)
{
    char *cp = (char*)str1;
    char *s1, *s2;
 
    if (!*str2)
        return((char *)str1);
 
    while (*cp) {
        s1 = cp;
        s2 = (char *)str2;
 
        while (*s1 && *s2 && !(*s1 - *s2))
            s1++, s2++;
 
        if (!*s2)
            return(cp);
 
        cp++;
    }
    return(NULL);
}

11、size()和length()区别

这是历史原因造成的: length() 是早期 C++ 标准中就存在的函数,延续了 C 语言中字符串处理的命名习惯 size() 是后来为了与 C++ STL(标准模板库)中的容器(如 vector、list 等)保持命名一致性而添加的,这些容器都使用 size() 表示元素数量

在实际编程中,这两个函数可以任意选用,效果完全一致。现代 C++ 代码中更倾向于使用 size(),以保持与其他容器的命名风格统一。

12、string_view

std::string_view 是 C++17 引入的一个轻量级字符串视图类,主要用于高效地访问字符串数据而不拥有其所有权,旨在解决传统 const std::string& 传递时可能产生的性能开销问题。

核心特性

  • 非所有权:不管理字符串内存,仅存储指向字符串数据的指针和长度,因此不会触发内存分配或拷贝。
  • 轻量性:通常仅包含两个成员(const char* 指针 + 长度 size_t),可高效传递(如按值传参)。
  • 只读访问:提供对字符串数据的只读视图,无法修改原始字符串内容。
  • 兼容性:可兼容 C 风格字符串(const char*)、std::string、std::string_view 等多种字符串类型。

主要用途

  • 函数参数传递:替代 const std::string&,避免传递字符串时的不必要拷贝(尤其是临时字符串或子字符串)。
  • 处理子字符串:高效获取字符串的子视图(无需拷贝数据)。
  • 解析字符串:在字符串解析场景(如分割、查找)中,避免频繁创建临时 std::string 对象。

This website is released under the MIT License.