字符串函数¶
约 677 个字 142 行代码 预计阅读时间 4 分钟
1.strlen¶
char c [] = "abc"; // char c [] = {'a','b','c','\0'};
cout << strlen(c) << endl;
- 定义:计算数组中'\0'之前的字符的长度。
- 返回值是无符号整形(例)。
strlen("abcd") - strlen("abcdef") > 0 注意这里转成int型换变成正数,所以是大于0 //最好不要做加减
2.strcpy¶
char arr1[20] = "a";
char arr2[] = "abc";
strcpy(arr1, arr2);
- 定义:将源数组内容拷贝到目标数组中。
- 源字符串必须以‘\0’结束,否则就会导致越界。
- strcpy会将源字符串的‘\0’拷贝到目标空间,目标空间要足够大,目标空间必须可变。
3.strcat¶
char arr1[20] = "hello" ; //这里的char数组大小最好预先定义
char arr2[10] = "world" ;
strcat(arr1, arr2);
printf("%s", arr1);
strcat(arr2,arr2)//错误
- 定义:将源字符串的内容追加到目标字符串空间中。从目标空间'\0'处 开始追加。
- 易错:自己追加自己会导致死循环。
- 特别注意!:源字符串和目标字符串必须以‘\0’结束,目标空间必须足够大,目标空间必须可修改。
4.strcmp¶
定义: 比较两个字符串中对应位置上的字符大小,直到找到不同或'\0'。
- 当str1>str2时,返回>0的数
- 当str1<str2时,返回<0的数
- 当str1=str2时,返回0
char arr1[] = { "abcd" }; char arr2[] = { "abcdef" }; char arr3[] = { "qq" }; int re1 = strcmp(arr3, arr2); int re2 = strcmp(arr3, arr3); int re3 = strcmp(arr1, arr2);
5.strncpy,strncat,strncmp¶
可以指定长度进行相应的操作,使代码变得相对安全
- char strncpy [] ( char destination [], const char source [], size_t num );(目标空间,源字符串,复制个数)
- char strncat [] ( char destination [], const char source [] , size_t num );(目标空间,源字符串,追加个数)
- int strncmp ( const char str1 [] , const char str2 [], size_t num );
6.springf¶
用于将格式化的数据写入字符串中,类似于printf函数,但是不是将结果打印到标准输出流,而是写入到一个字符数组中
char buffer[100];
int num = 42;
sprintf(buffer, "The answer is %d", num);
printf("%s\n", buffer); // 输出: The answer is 42
7.strchr¶
用于在一个字符串中搜索指定字符的第一次出现,并返回该字符的指针
const char *str = "hello world";
char *ptr = strchr(str, 'o');
8.strstr¶
用于在一个字符串中搜索指定子字符串的第一次出现,并返回该子字符串的指针,没有找到则返回NULL
const char *haystack = "hello world";
const char *needle = "world";
char *ptr = strstr(haystack, needle);
9.strtok¶
用于将字符串分解为一个个标记(token)
- 第一次调用strtok(),传入的参数str是要被分割的字符串"This is a sample string",而成功后返回的是第一个子字符串"This";
- 而第二次调用strtok的时候,传入的参数应该为NULL,使得该函数默认使用上一次未分割完的字符串继续分割 ,就从上一次分割的位置"This"为本次分割的起始位置,直到分割结束。
char str[] = "This is a sample string"; const char delim[] = " "; char *token = strtok(str, delim); while (token != nullptr) { printf("%s\n", token); token = strtok(nullptr, delim); } char str[] = "Hello,World!This,is,a,comma,separated,string"; const char delim[] = ",!"; // 定义分隔符,包括逗号和感叹号 //注意这里可以定义多个分隔符 // 使用 strtok 函数切割字符串 char *token = strtok(str, delim); // 循环获取所有子字符串 while (token != NULL) { printf("%s\n", token); // 进行下一次切割,传递 NULL 表示使用同一个字符串 token = strtok(NULL, delim); }
10.atoi 或者用 stoi¶
用于将字符串转换为整数。函数将返回转换后的整数值。它会从字符串的开头开始解析,直到遇到第一个非数字字符为止(可以包含正负号),然后将解析到的数字部分转换为整数返回。如果字符串中没有合法的数字,则返回 0。
char str[] = "+12345";
int num = atoi(str);
printf("Converted number: %d\n", num);
char * 与char []的转换¶
char str[] = "example";
char *ptr = str; // 直接将数组名赋给指针即可
char *ptr = "example";
int len = strlen(ptr);
char arr[len + 1]; // 需要额外的空间来存储字符串的拷贝以及终止符 '\0'
strcpy(arr, ptr);
综合应用:替换 删除 。。。¶
//全部拼接在一起
char ans [] = "";
char delim [] = " ,";
char * token = strtok(b,delim);
while(token != nullptr){
strcat(ans,token);
token = strtok(nullptr,delim);
}
cout << ans << endl;
// 字符串替换
//第一种
void replace (char * b,const char * a,const char * c){
int lenA = strlen(a);
int lenC = strlen(c);
char * p = strstr(b,a);
while(p != NULL){
if(lenA > lenC){
for (int i = 0; i <= strlen(p); i++) p[lenC + i] = p[lenA + i];
}
else{
for (int i = 0; i <= strlen(p); i++) p[strlen(p) + lenC - lenA - i] = p[strlen(p) - i];
}
for (int i = 0 ; i < lenC; i++)p[i] = c[i];
p = strstr( b + lenC,a);
}
}
//第二种
void replace(char * b,const char *a,const char * c){
int lenA = strlen(a);
int lenC = strlen(c);
char * p = strstr(b,a);
while(p != NULL){
memmove(p + lenC, p + lenA,strlen(p + lenA) + 1);
memcpy(p,c,lenC);
p = strstr(p + lenC,a);
}
}
//将b中的所有a替换成c
int main(){
char b[100] = "I love nanjing,I love China";
const char * a = "love";
const char * c = "like";
replace(b,a,c);
cout << b << endl;
return 0;
}
// 第二种的替换方法
void replace(char * b, const char * a, const char * c) {
int lenA = strlen(a);
int lenC = strlen(c);
char * p = strstr(b, a);
while (p != NULL) {
// 计算替换后字符串的长度
// 将剩余部分(包括 null 终止符)复制到新位置
strncpy(p + lenC, p + lenA, strlen(p + lenA) + 1;);
// 将新字符串复制到位置 p
strncpy(p, c, lenC);
// 寻找下一个匹配位置
p = strstr(p + lenC, a);
}
}