C/C++常见的字符串操作函数

本文详细介绍了C/C++中的字符串操作,包括字符数组操作(如strcat和strncat)、字符串比较(strcmp、strcasecmp、strspn、strcspn、strpbrk)、字符串拷贝(stpcpy、strncpy)、截取与分割(strstr、strchr、strrchr、strtok)、以及std::string的substr方法,以及length、size和strlen/sizeof的区别。
摘要由CSDN通过智能技术生成
2 字符串操作

​ 由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。注:字符串的结束标志是一个 \0 的转义字符。在计算字符串长度的时候 \0 是结束标志,不算作字符串内容。'\n’就是换行的意思,并且是一个字符

2.1 char[]
2.1.1 字符串拼接

字符串拼接函数主要使用strcat

示例代码:

#include <stdio.h>
#include <string.h>

int main() {
    char arr1[30] = "abc";//使用stract 必须让数组足够大
    char arr2[] = "def";
    strcat(arr1, arr2);
    printf("%s\n", arr1);
    return 0;
}

实现一个自己的拼接:

#include <iostream>
#include <sstream>
#include <vector>

std::string joinVector(const std::vector<double>& vec, const std::string& delimiter) {
    std::ostringstream oss;
    if (!vec.empty()) {
        // 将第一个元素添加到流中
        oss << vec[0];
        // 依次将后续元素添加到流中,每个元素前面加上分隔符
        for (size_t i = 1; i < vec.size(); ++i) {
            oss << delimiter << vec[i];
        }
    }
    return oss.str();
}

int main() {
    std::vector<double> hqivals = {1.2, 3.4, 5.6, 7.8};
    std::string delimiter = ", ";
    std::string result = joinVector(hqivals, delimiter);
    std::cout << result << std::endl;
    
    return 0;
}
2.1.2 字符串比较/查找

strcmp/strcasecmp是最严格的比较方法要求位置和字符串长度都要比较,而strspn/strcspn 是按照严格的位置进行对比进行查找的,strpbrk则最为宽松是不需要按照位置比较

(1)strcmp/strcasecmp

strcasecmp和strcmp都是用于字符串比较的函数,区别主要在于对大小写的敏感度和返回值的含义

C 库函数 int strcmp(const char *str1, const char *str2)str1 所指向的字符串和 str2 所指向的字符串进行比较。

int strcmp(const char *str1, const char *str2)

两个字符串自左向右逐个字符相比(按 ASCII 值大小相比较),直到出现不同的字符或遇 \0 为止。

#include <stdio.h>
#include <string.h>
 
int main ()
{
   char str1[15];
   char str2[15];
   int ret;
   strcpy(str1, "abcdef");
   strcpy(str2, "ABCDEF");
 
   ret = strcmp(str1, str2);
   if(ret < 0)
   {
      printf("str1 小于 str2");
   }
   else if(ret > 0) 
   {
      printf("str1 大于 str2");
   }
   else 
   {
      printf("str1 等于 str2");
   }
   return(0);
}

strcasecmp

函数是一个字符串比较函数,用于比较两个字符串是否相等,不区分大小写;如果s1和s2相等,则返回值为0。如果s1小于s2(按字典顺序,忽略大小写),则返回值为负数。如果s1大于s2(按字典顺序,忽略大小写),则返回值为正数。

示例代码:

#include <stdio.h>
#include <string.h>

int main() {
    const char* str1 = "Hello, World!";
    const char* str2 = "hELLO, wORLD!";

    int result = strcasecmp(str1, str2);

    if (result == 0) {
        printf("The strings are equal (case-insensitive).\n");
    } else if (result < 0) {
        printf("String 1 is less than String 2 (case-insensitive).\n");
    } else {
        printf("String 1 is greater than String 2 (case-insensitive).\n");
    }

    return 0;
}

如果要比较前7个字符:

if (strncasecmp(m_url, "http://", 7) == 0)

(2)strspn/strcspn

这两个函数是一对反义的函数,表示从str从第一个字符串开始,后续有多少字符相同;如果第一个字符串在chatset中,strspn会有值,若第一个字符串不在在chatset中,strspn会等于0,strcspn会有值

strspn示例代码:

const char *str = "abc123";
const char *charset = "abcdefghijklmnopqrstuvwxyz";
size_t length = strspn(str, charset);
printf("%zu\n", length);
//输出为3
const char *str = "1bc123";
const char *charset = "abcdefghijklmnopqrstuvwxyz";
size_t length = strspn(str, charset);
printf("%zu\n", length);
//输出为0

strcspn示例代码:

const char *str = "a123";
const char *charset = "abcdefghijklmnopqrstuvwxyz";
size_t length = strcspn(str, charset);
printf("%zu\n", length);
//输出为0
const char *str = "1bc123";
const char *charset = "abcdefghijklmnopqrstuvwxyz";
size_t length = strcspn(str, charset);
printf("%zu\n", length);
//输出为1

(3)strpbrk

比较两个字符串是否有相同的字符,不包括’\0’

返回值:返回指向str1中第一个匹配的字符的指针,若查找失败,则返回NULL

示例代码:

#include <string.h>
#include <stdio.h> 
int main(void){
   char *str1 = "www.dotcpp.com";
   char *str2 = "cde"; 
   char *ptr = strpbrk(str1, str2);
   if(ptr){
      printf("strpbrk found first character: %c\n", *ptr);
   }else{
      printf("strpbrk didn't find character in set\n");
   }
   return 0;
}
//result:strpbrk found first character: d
2.1.3 字符串拷贝

(1) stpcpy

Char * stpcpy(char* destination, const char *source)

特性:(1)源字符串必须以’\0’结束;

​ (2)会将源字符串必须’\0’拷贝到目标空间

​ (3)目标空间必须足够大

#include <stdio.h>
#include <string.h>

int main() {
    char a[10] = "123";//数组,定义好了不能进行复制改变值
    stpcpy(a, "C++");//只能在内存上进行操作
    printf("%s\n", a);
    return 0;
}

(2) strpncpy

char * strncpy ( char * destination, const char * source, size_t num )

size_t 是无符号整数类型,从源复制的最大字符数,也就是说strncpy(sub,char+3,4) // 将char中从3开始的4个数字复制到sub中

/*  char 字符串切片截取 strncpy
    比较两个char*字符串是否相等,if(strcmp(recData,name) == 0)来判断
*/

# include<iostream>
using namespace std;

int main () {
	char str1[] = "To be or not to be";
	char str2[40];
	char str3[40];

	/* copy to sized buffer (overflow safe): */
	strncpy ( str2, str1, sizeof(str2) );

	/* partial copy (only 5 chars): */
	strncpy ( str3, str2, 5 );
	str3[5] = '\0';   /* null character manually added */

	puts (str1);
	puts (str2);
	puts (str3);

	cout << "-------" << endl;

	char dest[4] = {""};
	char src[] = {"123456789"};
	strncpy(dest, src, 3);
	puts(dest);

	cout << "-------" << endl;

	char dest1[4] = {""};
	char src1[] = {"123456789"};
	strncpy(dest1, src1 + 3, 3);
	dest[4] = '\0';              //n<sizeof(src)时,必须有这一句,不然输出出错
	puts(dest1);

	return 0;
}
2.1.4 字符串截取和分割

(1)strstr

根据字符串截取

#include <stdio.h>
#include <string.h>

int main() {
    char* p1 = "abcdaa";
    char* p2 = "cda";
    char *ret = strstr(p1, p2);
    if( ret == NULL)
    {
        printf("字符串不存在");
    } else{
        printf("%s\n", ret);//输出cdaa
        printf("%s\n", p1);//输出abcdaa
    }

    return 0;
}

示例代码:

 
int main()
{
	int num; //你需要的值
	const char* s = "m_tMediaConfig.dbMinCivalueLimit = 6";
	const char* p = strstr(s, "=");
	if (p)  //找到等号
	{
		++p; //跳过等号
		num = atoi(p); //此时num将等于6
	}
	//.........
	return 0;
}

(2)strchr()和strrchr()

这两个函数也是截取函数,但是通过查找相同的字节,截取这个字节以及后面所有字节组成的字符串,strchr()是从前往后查找,strrchr()是从后往前查找;

示例代码:

#include <stdio.h>
#include <string.h>

int main(int argc, const char* argv[])
{
    //container_test();
    int len;
    char str[] = "https://www.runoob.com";
    char ch = '.';
    char* ret1 = strrchr(str, ch);
    printf("%c 之后的字符串是: %s\n", ch, ret1); //输出.com

    char* ret2 = strchr(str, ch);
    printf("%c 之前的字符串是: %s\n", ch, ret2);//输出.runoob.com
    return 0;
}

**(3)字符串分割 strtok **

C 库函数 char *strtok(char *str, const char *delim) 分解字符串 str 为一组字符串,delim 为分隔符。

char *strtok(char *str, const char *delim)

**用法:第一个参数不为NULL,函数将找到s tr中第一个标记,strtok函数将保存它在字符串的位置

​ 第一个参数为null,函数将在同一个字符串中被保存的位置开始,查找下一个标记;**

示例代码:

#include <stdio.h>
#include <string.h>

int main() {
    char arr[] = "zpw@bitedu.tech";
    char* p = "@.";

    char buff[1024] = {0};
    stpcpy(buff, arr);
    //直接分割
    char* ret = NULL;
    for(ret = strtok(arr, p); ret != NULL; ret = strtok(NULL, p))
    {
        printf("%s\n", ret);
    }
//    char *ret = strtok(arr, p);
//    printf("%s\n", ret);
//    ret = strtok(NULL, p);
//    printf("%s\n", ret);
//    ret = strtok(NULL, p);
//    printf("%s\n", ret);
    return 0;
}
2.2 std::string
2.2.1 substr

这个函数类似于Python的切片操作,函数原型:

string substr(int pos = 0,int n ) const;
// 该函数功能为:返回从pos开始的n个字符组成的字符串,原字符串不被改变

示例代码:

# include <iostream>
# include <string>
using namespace std;
 
int main()
{
    const string image_name = "0170.bmp";
    print(image_name.substr(0, 4));
    return 0;
}
2.2.2 length size, sizeof 和strlen

sizeof 和strlen这两个来自char语言,length 和size来自std::string

length(): 用来获取字符串的长度。例如:string str = “asdfghjkl”,str.length() = 9。

strlen() :Strlen 返回的是’\0’结束前字符的个数,也就是说必须有’\0’,不然返回随机数;注意函数的返回值是size_t,是无符号的;

size(): 在获取字符串长度时,size()函数与length()函数作用相同。除此之外,size()函数还可以获取vector类型的长度。

sizeof():sizeof()运算符用来求对象所占内存空间的大小。Sizeof 返回的是字符的个数,包括’\0’

  • 28
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值