NDK-009:C4: 字符串常用操作
2024-12-30 本文已影响0人
xqiiitan
char*
1.字符串操作:%s 占位符
// 第一种:字符串数组。字符串结尾以'\0' 作为结尾。
char str[] = {'a', 'b', 'c', 'd', '\0' }; // 使用字符串数组的形式
printf("%s", str);
// 第二种:char*
char* str2 = "Darren"; // char* 拿到数组的首地址
// 区别:"Darren" 相当于数组,能用char*首地址接收。
// 一个能修改,一个不能修改。第一种方式能修改str[2]='z';
// 第二种方式,常量 不能修改。
网站: en.cppreference.com/w/c/
2.字符串长度 strlen(str)
通过字符'\0'来判断字符串结尾的。
int strlen_s(char* str) { // 自己实现获取字符串长度。
int length = 0;
while(*(str++) != '\0') { // 判断末尾字符
length ++;
}
return length;
}
char * name = "Darren"; // 长度:6
printf("name length is: %d", strlen(name));
int mLen = strlen_s(name); // sizeof(str)/sizeof(char);这种方式有错。
3.字符串转换
从前往后转换,能转就转。后面不能转的剔除。
#include <stdio.h>
char* num = "12.5"; 转float,转int,转double。
int i = atoi(num); // 12 不能转换返回0,后面有非数字的字符会被剔除。12ww转后是12
float f = atof(num); // 12.500000, 默认小数点后6个0。
double d = strtod(num, NULL); // 12.500000 %lf double占位符。
4.字符串比较。strcmp
void main() {
char* str1 = "Darren";
char* str2 = "darren";
int res = strcmp(str1, str2); // 区分大小的写比较
int res2 = _strcmpi(str1, str2); // strcmpi 不区分大小写比较。android: strcasecmp
// 比较前几个字符, count代表字符的前几个个数,是否相等。
int res3 = strncmp(str1, str2, 5);
// strnicmp(str1,str2,4);
}
5.字符串查找strstr 和 拼接
strstr 返回目标字符串 第一次出现的指针。
char* str = "name is Darren";
char* name = "D";
char* res = strstr(str, name); // 返回Darren的指针。找不到返回NULL。
// 使用指针相减,可以得到name的位置。
int position = res - str; // name在str中第一次出现的位置。
包含:判断position 是不是NULL。
if(position) { // 包含了,否则就是不包含。
// 包含了目标字符串
} else{ // 不包含
}
5.1 拷贝
char* str = "Hello";
char* str1 = " World";
int destLen = strlen(str);
char dest[20];
strcpy(dest, str); // str copy过来,copy到dest中。
5.2 拼接 strcat
strcat(dest, str1); // 打印:Hello World
5.3 截取(含头不含尾)
char* sub_str(char* str, int start, int end) {
// 开辟一个字符串,去存储数据
//char sub[end-start];
char* sub = (char *)malloc((end-start)*sizeof(char) +1);
// 注意:malloc一定要free掉。
// 遍历赋值
int len = end-start;
str +=start; // 指针往后挪动
for(int i=0; i<len; i++) {
sub[i] = *str;
str++; // 指针后移
}
sub[len] = '\0'; // 指针最后,标记字符串结尾,否则print无法判断字符串结束
// free(sub);
return sub;
}
void main(){
char *str = "Darren is big";
// 截取3-5字符。
char* result;
char * sub = sub_str(str, 3, 5);
printf("%s", sub);
// free(sub); // 释放 malloc申请的内存。自己的方法,要自己处理好内存。
// 所以在ndk一般会采用 静态的数组存储。char sub[len] 申请内存,就不要free了。
}
5.4 大小写转换
// 不带返回值的定义,用一个变量用来接收
void lower(char* dest, char* source) { // 指向数组首地址
while(*source != '\0') {
char ch = *source; // 拿到第一个字符
*dest = tolower(ch); // 转小写,赋值给dest;转大写toupper
source++; // 指针后移
dest++;
}
*dest = '\0'; \\结尾符
}
// 大小写转换
void main() {
char* name ="Hello";
char* result;
lower(result, name);
printf("result= %d", result);
}
// 字符串替换:aabbaabbaabb 将aa替换为cc。
strcmp 比较字符串。