字符串

  • 字符串是特殊的字符数组,数组的结尾字符为'\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);
}