C语言字符串详解

本文详细讲解了C语言中的字符串概念,包括字符串的内存占用、初始化、与指针的关系,以及字符串的结尾标志。同时,文章重点介绍了字符串常用的库函数,如strlen、strcpy、strncpy、strcat、strncat、strcmp、strncmp、strchr、strrchr和strstr,并提供了相应的函数实现及运行效果展示。
摘要由CSDN通过智能技术生成

目录

一、字符串的概念

二、占用内存的情况

三、字符串的初始化

四、字符串与指针

 五、字符串的结尾标志

六、字符串常用的库函数

1、获取字符串的长度(strlen)

举个例子

运行效果

自己实现一个 strlen 函数

运行效果

2、字符串复制或赋值(strcpy)

 自己实现一个 strcpy 函数

运行效果

3、字符串复制或赋值(strncpy)

自己实现一个 strncpy 函数

运行效果

4、字符串拼接(strcat)

自己实现一个 strncpy 函数 

运行效果

 5、字符串拼接(strncat)

自己实现一个 strncat 函数  

运行效果

6、字符串比较(strcmp、strncmp)

自己实现一个strcmp 函数

运行效果 

自己实现一个strncmp函数

运行效果

7、字符查找(strchr、strrchr)

自己实现一个strchr函数

运行效果 

自己实现一个strrchr函数

8、字符串查找(strstr)

 自己实现一个 strstr 函数

运行效果


一、字符串的概念

我们可以把字符串储存在char类型的数组中,如果char类型的数组末尾包含一个表示字符串末尾的空字符\0,则该数组中的内容就构成了一个字符串

因为字符串需要用\0结尾,所以在定义字符串的时候,字符数组的长度要预留多一个字节用来存放\0,\0就是数字0

例如

char name[21];  // 定义一个最多存放20个英文字符或十个中文的字符串
  • 字符串也可以存放中文和全角的标点符号,一个中文字符占两个字节(GBK编码)。char strname[21]用于存放中文的时候,最多只能存10个汉字。
  • 字符串采用双引号包含起来,如:"hello,world"、"你好C语言"

二、占用内存的情况

一个字符占用一字节的内存,字符串定义时数组的大小就是字符串占用内存的大小

  char str[21];     // 占用21字节的内存
  char str[1024];   // 占用1024字节的内存

三、字符串的初始化

char name[21];
memset(name,0,sizeof(name));//采用memset函数初始化字符串

四、字符串与指针

数组名是数组元素的首地址,字符串是字符数组,所以在获取字符串的地址的时候,不需要用&取地址

char name[21];
memset(name,0,sizeof(name));
strcpy(name,"hello,xiaoqiu");//把hello,xiaoqiu赋值给name
printf("%s\n",name);

 五、字符串的结尾标志

  1. 字符串的结尾标志是0,如果没有结尾标志,后面的内容将被丢弃
  2. 结尾标志后面的内容如何处理
#include <stdio.h>
#include <string.h>

int main()
{

   char name[21];
   memset(name,0,sizeof(name));
   strcpy(name,"hello,xiaoqiu");//把hello,xiaoqiu赋值给name

   name[5]=0;//强制把第6个元素赋值为0   

   printf("%s\n",name);

   return 0;
}

运行效果

以上代码输出的结果是 hello ,但是,在内存中的值仍是hello0xiaoqiu,后面的 xiaoqiu 成了内存中的垃圾值

不要让字符串的内存中有垃圾值,容易产生意外的后果。这就是字符串的初始化不建议采用把第一个元素的值置为0的原因(name[0]=0)

六、字符串常用的库函数

1、获取字符串的长度(strlen)

size_t  strlen( const char*  str);
  1. 功能:计算字符串的有效长度,不包含 \0
  2. 返回值:返回字符串的字符数 
  3. strlen 函数计算的是字符串的实际长度,遇到第一个\0结束
  4. 函数返回值一定是size_t,是无符号的整数,即typedef unsigned int size_t
  5. 如果您只定义字符串没有初始化,求它的长度是没意义的,它会从首地址一直找下去,遇到0停止
  6. 很多人对 sizeofstrlen 有点分不清楚 。sizeof 返回的是变量所占的内存数,不是实际内容的长度

举个例子

#include <stdio.h>
#include <string.h>
int main()
{
    char name[21];
    memset(name,0,sizeof(0));
    strcpy(name,"xiaoqiu");

    printf("strlen=%d\n",strlen(name)); // 7
    printf("sizeof=%d\n",sizeof(name)); // 21  sizeof 返回的是变量所占的内存数

    return 0;
}

运行效果

自己实现一个 strlen 函数

#include <stdio.h>
#include <string.h>

int mystrlen(const char* str)
{   
    int i = 0;
    while( str[i]!='\0' ) {
     i++;
    }
    return i;
}

int main()
{
    char name1[21];
    memset(name1,0,sizeof(0));
    strcpy(name1,"xiaoqiu");

    char name2[21];
    memset(name2,0,sizeof(0));
    strcpy(name2,"baidu");

    printf("mystrlen=%d\n",mystrlen(name1)); // 7
    printf("mystrlen=%d\n",mystrlen(name2)); // 5

    return 0;
}

运行效果

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易点点心动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值