定义字符串的二种方式
- 方式一
char str[] = {'H', 'e', 'l', 'l', 'o', '\0'}; // 加上'\0'的作用是打印有个结尾
- 方式二
char *str2 = "Hello"; // 这名话会隐式加了\0, 所以这个不需要在后面加\0
上面二种方式在使用上也是有区别
// 方式一
char str[] = {'H', 'e', 'l', 'l', 'o', '\0'};
// 方式二
char *str2 = "Hello";
// 方式一可以执行修改操作 如下
str[2] = 'z'; // 这样是没问题的
// 方式二如果执行方式一会出现崩溃如下代码
str2[2] = 'z'; // 不能这样做
// 原因,方式一是因为生成的字符串Hello是在静态区,但是创建str的时候它是将Hello拷贝过来,操作的是一个副本,所以没影响
// 方式二则不同,方式二是直接将str2的地址指向的静态区的Hello,而静态区的数据是不能修改的,所以系统会拒绝访问而出现异常。
获取字符串长度
- 方式一
int getLen1(char *string) {
int count = 0;
while (*string) { // *string !='\0' 判断的是\0而不是0 就是一直遍历下去 *string取string的值
string++; // 指针挪动
count++;
}
return count;
}
char string[] = {'a', 'b', 'c', 'd', 'e', 'f', '0', '\0'};
int len = getLen1(string);
- 方式二
char string2[] = {'a', 'b', 'c', 'd', 'e', 'f', '0', '\0'};
int len2 = sizeof string2 / sizeof(char);
字符串转换
char *num = "1";
// 将num转为int类型
int c_int = atoi(num);
字符串比较
char * test1 = "Lucy";
char * test2 = "lucy";
// 使用系统API
int result_2 = strcmp(test1, test2); // 它是区分大小写
// result_2如果返回0 则代表相等,
int result_3 = strcmpi(test1, test2); // 它是不区分大小写
字符串查找及获取位置
char *text = "name-is-Lucy";
char * subtext = 'i';
char * pop = strstr(text, subtext);
if (pop) { // 非null 就查找到了
printf("查找到了,pop的值是:%s\n", pop); // 会把找到的后面一截全部打印出来 查找到了,pop的值是:is-Lucy
}
// 获取位置
int index = pop - text; // pop = is-Lucy, text = name-is-Lucy 直接指针减法就可以
字符串拼接
// 字符串拼接得定义一个容器
char destination[25];// 25容器大小 这个是写死的。
// 定义几个字符串
char *blank = "--到--", *CPP = "C++", *Java = "java";
// 使用api strcpy
strcpy(destination, CPP);//先copy到数组里,
strcat(destination, blank); // 然后再拼接
strcat(destination, Java); // 然后再拼接
printf("拼接后的结果: %s\n", destination);
大小写转换
void lower(char *dest, char *name) {
printf("name: %p\n", &name);
char *temp = name;
while (*temp) {
*dest = tolower(*temp);
temp++; // 挪动指针
dest++;// 存储的也要挪动,目是的挪动一个储存一个
}
*dest = '\0'; // 避免打印系统值
printf("name: %p\n", &name);
}
char *name = "Hello World";
// 先定义结果
char dest[20];
lower(dest, name);
printf("小写转换后的结果是: %s\n", dest);
printf("name: %p\n", &name);
字符串的截取
void subString(char *result, char *str, int start, int end) {
char *temp = str + start;
int i = start;
for (; i < end; i++) {
*result = *(temp+i);
result++;
}
*result = '\0';
}
char *string = "My-name-is-Hanmeimei";
char *result[30];
subString(result, string, 2, 6); // 截取第二到第六个字符
printf("截取后的值为: %s\n", result);