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 比较字符串。

上一篇 下一篇

猜你喜欢

热点阅读