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’