C语言-字符串
- 1. 字符串操作
-
- 1.1 字符串遍历
- 1.2 字符串赋值
- 1.3 字符串输入输出
- 2. 字符串与函数
-
- 2.1 字符串传参
- 2.2 字符串返回
- 3. 字符串指针与字符数组的区别
-
- 3.1 `sizeof`与`strlen()`
- 3.2 替换字符
- 3.3 字符串字面量初始化
- 4. 字符串函数
-
- 4.1 字符串长度
- 4.2 字符串比较
- 4.3 字符串拷贝
- 4.4 字符串连接
- 4.5 字符查找
- 4.6 子串查找
1. 字符串操作
1.1 字符串遍历
可以通过数组方式遍历字符串。
char* str="Hello World";
for(int i = 0;'\0' != str[i];++i){
printf("%c\n",str[i]);
}
也可以使用指针方式
char* str="Hello World";
for(int i = 0;'\0' != *str;++i){
printf("%c\n",*(str+i));
}
指针方式可以简化成
char* str="Hello World";
for(;'\0' != *str;++str){
printf("%c\n",*str);
}
甚至是
while('\0' != *str){
printf("%c\n",*str++);
}
1.2 字符串赋值
char* s = "Hello World";
char* t;
t = s;
printf("%s\n",t);
没有产生新的字符串,只是s和t指向相同的字符串。下面是查看两个字符串的地址。
printf("%p\n",s);
printf("%p\n",t);
1.3 字符串输入输出
char str[8];
scanf("%s",str);
printf("%s\n",str);
scanf()
读入一个单词直到空白符(空格、回车、Tab)
scanf()
不安全,因为不知道要读入的内容长度,容易溢出。
例如:输入
123456789
解决方式:指定读取的长度。
char str[8];
scanf("%7s",str);
printf("%s\n",str);
%
与
s
之间的数字表示最多允许输入的字符数,这个数字要比数组长度少
1
。
2. 字符串与函数
2.1 字符串传参
字符串传参方式与数组传参方式一样,只不过很多时候不需要传递字符串的长度。
void print_string(char str[]){
printf(str);
}
或者
void print_string(char* str){
printf(str);
}
2.2 字符串返回
字符串返回只能使用指针
char*
3. 字符串指针与字符数组的区别
3.1 sizeof
与 strlen()
sizeof
strlen()
#include <stdio.h>
#include <string.h>
int main(){
char arr[] = "Hello World";
char* ptr = "Hello World";
printf("sizeof(arr) = %ld\n",sizeof(arr));
printf("strlen(arr) = %ld\n",strlen(arr));
printf("sizeof(ptr) = %ld\n",sizeof(ptr));
printf("strlen(ptr) = %ld\n",strlen(ptr));
}
3.2 替换字符
- 修改字符数组
- 字符串指针 输出错误是因为字符串字面量不能用下标改值。
- 指向字符数组的字符串指针
- const字符数组 编译不通过,error是因为const字符数组不允许修改.(但是可以通过指针修改,见5)
- 指向const字符数组的字符串指针
3.3 字符串字面量初始化
字符串字面量初始化字符数组
字符串字面量初始化字符串指针
char* str1 = "Hello World";
char str2[] = "Hello World";
str1[5] = '\0'; // Error
str2[5] = '\0'; // OK
printf("str1=%s\n",str1);
printf("str2=%s\n",str2);
str1
是一个指针,初始化指向一个字符串常量。
修改字符串常量可能会导致严重后果。
str2
是一个字符数组,初始化把字符串字面量自动复制到数组中。
如何选择?
- 如果需要构造字符串使用数组;如果需要处理字符串使用指针。
- 字符串不需要修改使用字符串字面量初始化字符串指针。
- 字符串需要修改使用字符串字面量初始化字符数组。
4. 字符串函数
这些函数包含在
#include<string.h>
头文件中
4.1 字符串长度
size_t strlen(const char *s);
返回字符串长度不包含
\0
。
4.2 字符串比较
比较两个字符串
返回
,表示
s1 == s2
返回
>0
,表示
s1 > s2
返回
<0
,表示
s1 < s2
4.3 字符串拷贝
把字符串src拷贝到dst。
restrict
是C99关键字,表示src和dst不能重叠,便于并行处理。
返回值为dst,便于连接。
连续赋值。
复制一个字符串
// char* dst = (char*)malloc(strlen(src)+1);
char dst[strlen(src)+1];
strcpy(dst,src);
4.4 字符串连接
把s2拷贝到s1的后面,拼接成一个长的字符串。
返回s1,注意:s1必须有足够的空间。
4.5 字符查找
char* strchr(const char*s,int c);
char* strrchr(const char*s,int c);
返回找到字符的指针,没找到返回NULL
4.6 子串查找
char* strstr(const char*s1,const char*s2);
char* strcasestr(const char*s1,const char*s2);