字符串
- 字符串是特殊的字符数组,数组的结尾字符为
'\0'
- 需要多出一位长度保存字符串的结尾标志
包含头文件
#include <stdio.h>
#include <string.h>
字符串的声明与初始化
直接赋值和通过函数拷贝赋值。
char str[128] = "字符串是以转义字符\"\\0\"结尾的字符数组";
memset(str, 0, sizeof(str)); // 初始化为0
strcpy(str, "字符串是以转义字符\"\\0\"结尾的字符数组"); // 通过函数拷贝赋值
格式化输出
左对齐和右对齐输出字符串。
printf("%s\n", str);
printf("=%53s=\n", str); // 右对齐输出
printf("=%-53s=\n", str); // 左对齐输出
字符串常用函数
求字符串长度
unsigned int len = strlen(str);
printf("字符串:%s,的长度是:%u\n", str, len);
字符串拷贝
strcpy(str, "字符串拷贝函数的使用");
printf("拷贝后字符串:%s\n", str);
拷贝前n个字符
strncpy(str, "我是一个字符串", 5);
printf("拷贝n个字符后字符串:%s\n", str);
字符串拼接
strcat(str, "拼接字符串的内容");
printf("拼接后字符串:%s\n", str);
拼接前n个字符
strncat(str, "拼接前n个字符", 5);
printf("拼接前n字符后字符串:%s\n", str);
字符串比较
char str1[10] = "abc";
char str2[10] = "abd";
int res = strcmp(str1, str2);
printf("字符串:%s 与字符串:%s比较的结果:%d\n", str1, str2, res);
比较字符串前n字符的大小
res = strncmp(str1, str2, 2);
printf("字符串:%s 与字符串:%s前n个字符比较的结果:%d\n", str1, str2, res);
字符串查找
char c = 'd';
char *res1 = strchr(str1, c);
printf("字符%c在字符串%s第一次出现的位置:%p\n", c, str1, res1);
res1 = strrchr(str2, c);
printf("字符%c在字符串%s最后一次出现的位置:%p\n", c, str2, res1);
子串查找
strcpy(str, "字符串查找子串");
strcpy(str1, "子串");
res1 = strstr(str, str1);
printf("子串:%s在字符串:%s第一次出现的位置:%p,子串是:%s\n", str1, str, res1, res1);
字符串地址偏移法
strcpy(str, "abcde");
printf("初始字符串:%s\n", str);
strcpy(str, str + 1);
printf("偏移字符串1:%s\n", str);
strncpy(str, str + 1, 2);
str[2] = '\0';
printf("偏移字符串2:%s\n", str);
完整实例代码
#include <stdio.h>
#include <string.h>
int main(){
//直接赋值
//汉字占两个字节
char str[128] = "字符串是以转义字符\"\\0\"结尾的字符数组";
//字符串的初始化
memset(str,0,sizeof(str));
//通过函数拷贝赋值
strcpy(str,"字符串是以转义字符\"\\0\"结尾的字符数组");
//格式化输出
printf("%s\n",str);
//左对齐输出,数字表示输出多少个字符,字符不足的前面使用空格填充,大于字符数量的按实际输出
printf("=%53s=\n",str);
//右对齐输出,数字表示输出多少个字符,字符不足的后面使用空格填充,大于字符数量的按实际输出
printf("=%-53s=\n",str);
//字符串常用函数
//求字符串长度,从首地址开始找,知道到找到转义字符 \0
unsigned int len = strlen(str);
printf("字符串:%s,的长度是:%u\n",str,len);
//字符串拷贝,拷贝完在最后追加了一个转义字符 \0
strcpy(str,"字符串拷贝函数的使用");
printf("拷贝后字符串:%s\n",str);
//拷贝前n个字符,拷贝到对应的位置,不会自动添加转义字符 \0
strncpy(str,"我是一个字符串",5);
printf("拷贝n个字符后字符串:%s\n",str);
//字符串拼接,原有的转义字符 \0 会被覆盖,拼接后在后面再追加一个转义字符 \0
strcat(str,"拼接字符串的内容");
printf("拼接后字符串:%s\n",str);
//拼接前n个字符
strncat(str,"拼接前n个字符",5);
printf("拼接前n字符后字符串:%s\n",str);
char str1[10] = "abc";
char str2[10] = "abd";
int res;
//字符串比较,大于返回1,相等返回0,小于返回-1
res = strcmp(str1,str2);
printf("字符串:%s 与字符串:%s比较的结果:%d\n",str1,str2,res);
//比较字符串前n字符的大小
res = strncmp(str1,str2,2);
printf("字符串:%s 与字符串:%s前n个字符比较的结果:%d\n",str1,str2,res);
//字符串查找
char c = 'd';
//返回字符c第一次出现的位置的指针,不存在返回 NULL
char *res1 = strchr(str1,c);
printf("字符%c在字符串%s第一次出现的位置:%p\n",c,str1,res1);
//返回字符c最后一次出现的位置的指针,不存在返回 NULL
res1 = strrchr(str2,c);
printf("字符%c在字符串%s最后一次出现的位置:%p\n",c,str2,res1);
//子串查找
strcpy(str,"字符串查找子串");
strcpy(str1,"子串");
//找到子串返回子串开始字符的指针,没有找到返回NULL
res1 = strstr(str,str1);
printf("子串:%s在字符串:%s第一次出现的位置:%p,子串是:%s\n",str1,str,res1,res1);
//字符串地址偏移法
strcpy(str,"abcde");//将abcd赋值给str
printf("初始字符串:%s\n",str);
strcpy(str,str+1);//将bcde赋值给str
printf("偏移字符串1:%s\n",str);
strncpy(str,str+1,2);//将cd赋值给str
str[2] = '\0';
printf("偏移字符串2:%s\n",str);
}