C语言字符串详解,C语言字符串操作详解指南

马肤

温馨提示:这篇文章已超过462天没有更新,请注意相关的内容是否还可用!

摘要:,,本文详细解析了C语言中的字符串。介绍了字符串的基本概念、定义方式及其在C语言中的特殊性质。文章深入探讨了字符串的存储方式、操作方法和常用函数,如字符串的赋值、比较、连接、查找和分割等。通过本文,读者可以更好地理解C语言中字符串的特性和使用方法,为编写高效的C语言程序打下基础。

目录

一、字符串的概念

二、占用内存的情况

三、字符串的初始化

四、字符串与指针

 五、字符串的结尾标志

六、字符串常用的库函数

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,则该数组中的内容就构成了一个字符串

C语言字符串详解,C语言字符串操作详解指南 第1张

因为字符串需要用\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 
    #include 
    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;
    }
    

    运行效果

    C语言字符串详解,C语言字符串操作详解指南 第2张

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

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

    六、字符串常用的库函数

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

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

      #include 
      #include 
      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 
    #include 
    int mystrlen(const char* str)
    {   
        int i = 0;
        while( str[i]!='

    运行效果

    ' ) { 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; }

    C语言字符串详解,C语言字符串操作详解指南 第3张

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

    char *strcpy(char* dest, const char* src);
  • 功 能: 将参数src字符串拷贝至参数dest所指的地址
  • C语言字符串详解,C语言字符串操作详解指南 第4张

  • 返回值: 返回参数dest的字符串起始地址
  • 复制完字符串后,在dest后追加0
    1. 如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况
    2.  自己实现一个 strcpy 函数

      #include 
      #include 
      char *mystrcpy(char* dest,const char* src)
      {   
          size_t i = 0;
          
          while (src[i] != '

      运行效果

      ') { dest[i] = src[i]; i++; } dest[i]='

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

      '; return dest; } int main() { char name[21]; memset(name,0,sizeof(0)); mystrcpy(name,"xiaoqiu"); printf("strlen=%d\n",strlen(name)); // 7 printf("sizeof=%d\n",sizeof(name)); // 21 return 0; }
      char * strncpy(char* dest,const char* src, const size_t n);
  • 功能:把src前n字符的内容复制到dest中
  • 返回值:dest字符串起始地址
  • 如果src字符串长度小于n,则拷贝完字符串后,在dest后追加0,直到n个
  • C语言字符串详解,C语言字符串操作详解指南 第5张

  • 如果src的长度大于等于n,就截取src的前n个字符,不会在dest后追加0
  • dest必须有足够的空间放置n个字符,否则可能会造成缓冲溢出的错误情况
    1. 自己实现一个 strncpy 函数

      #include 
      #include 
      char *mystrncpy(char* dest,const char* src,const size_t n)
      {
          int len = (strlen(src)>n)?n:strlen(src);
          size_t i = 0;
          for (i=0;in)?n:strlen(src);
          int destlen = strlen(dest);
          int i = 0;
          for (i=0;i strlen(str2) )  len = strlen(str2);
           
           else len = strlen(str1);
           
           for (i = 0;i str2[i]) return 1;
           
           else return -1;
      }    
      int main()
      {
          char name1[21];
          memset(name1,0,sizeof(0));
          strcpy(name1,",xiaoqiu");
          char name2[21];
          memset(name2,0,sizeof(0));
          strcpy(name2,"hello");
          printf("%d\n",mystrcmp(name1,name2));
          return 0;
      }
                                     

      运行效果 

      int strncmp(const char *str1,const char *str2 ,const size_t n);

      自己实现一个strncmp函数

    #include 
    #include 
    int mystrcmp(const char *str1,const char *str2,size_t n)
    {   
        int i = 0;
        
        for (i = 0;i str2[i]) return 1;
        
        else return -1;
    }
    int main()
    {
        char name1[21];
        memset(name1,0,sizeof(0));
        strcpy(name1,",xiaoqiu");
        char name2[21];
        memset(name2,0,sizeof(0));
        strcpy(name2,"hello");
        printf("%d\n",mystrcmp(name1,name2,4));
        return 0;
    }
    

    运行效果

    7、字符查找(strchr、strrchr)

    C语言字符串详解,C语言字符串操作详解指南 第6张

    char *strchr(const char *s,const int c);

    功能:比较str1和str2前n个字符的大小

    返回值:相等返回0,str1大于str2返回1,str1小于str2返回-1

    两个字符串比较的方法是比较字符的ASCII码的大小,从两个字符串的第一个字符开始,如果分不出大小,就比较第二个字符,如果全部的字符都分不出大小,就返回0,表示两个字符串相等

    自己实现一个strchr函数

    #include 
    #include 
    char *mystrchr(const char *s,const int c)
    {   
        int i = 0;
        
        int len = strlen(s);
        
        for (i = 0;i=0;i--) {
           if (s[i]==c)
           return (char *)s+i;
        }
        return 0;
    }
    int main()
    {
        char name1[21];
        memset(name1,0,sizeof(0));
        strcpy(name1,",qqqxiaoqiu");
        printf("%s\n",mystrrchr(name1,'q'));
        return 0;
    }
    

    8、字符串查找(strstr)

    C语言字符串详解,C语言字符串操作详解指南 第7张

    char *strstr(const char* str,const char* substr);
  • 功能:检索子串在字符串中首次出现的位置
  • 返回一个指向在字符串s中第一个出现c的位置,如果找不到,返回0

  • 返回值:返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回0
  •  自己实现一个 strstr 函数

    运行效果

    C语言字符串详解,C语言字符串操作详解指南 第8张  

    #include 
    #include 
    char *mystrstr(const char* str,const char* substr)
    {   
        char* pos = (char *)str;//要被检索的 C 字符串
        char* pos1 = NULL;
        
        while (1) {
          
          if (pos[0]==0) break; // 如果要被检索的 C 字符串已经结束 break
          
          pos1 = strchr(pos,substr[0]); // 在pos中查找子字符串的首字符。
          
          if (pos == 0) return 0; // 如果没有找到,直接返回0
          
          if ( strncmp(pos1,substr,strlen(substr)) ==0  )  return pos1;// 如果找到了,返回找到的地址。
          
          pos++;// 待搜索的位置后移一个字节。
        }
    }
    int main()
    {
        char name1[21];
        memset(name1,0,sizeof(0));
        strcpy(name1,",qqqxiaoqiu");
        printf("%s\n",mystrstr(name1,"xiao"));
        return 0;
    }
    

    运行效果

      C语言字符串详解,C语言字符串操作详解指南 第9张

       


    0
    收藏0
    文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

    相关阅读

  • 【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法,Matlab/Simulink自动生成代码的五种选择结构实现方法(二),Matlab/Simulink自动生成代码的五种选择结构实现方法详解(二)
  • 超级好用的C++实用库之跨平台实用方法,跨平台实用方法的C++实用库超好用指南,C++跨平台实用库使用指南,超好用实用方法集合,C++跨平台实用库超好用指南,方法与技巧集合
  • 【动态规划】斐波那契数列模型(C++),斐波那契数列模型(C++实现与动态规划解析),斐波那契数列模型解析与C++实现(动态规划)
  • 【C++】,string类底层的模拟实现,C++中string类的模拟底层实现探究
  • uniapp 小程序实现微信授权登录(前端和后端),Uniapp小程序实现微信授权登录全流程(前端后端全攻略),Uniapp小程序微信授权登录全流程攻略,前端后端全指南
  • Vue脚手架的安装(保姆级教程),Vue脚手架保姆级安装教程,Vue脚手架保姆级安装指南,Vue脚手架保姆级安装指南,从零开始教你如何安装Vue脚手架
  • 如何在树莓派 Raspberry Pi中本地部署一个web站点并实现无公网IP远程访问,树莓派上本地部署Web站点及无公网IP远程访问指南,树莓派部署Web站点及无公网IP远程访问指南,本地部署与远程访问实践,树莓派部署Web站点及无公网IP远程访问实践指南,树莓派部署Web站点及无公网IP远程访问实践指南,本地部署与远程访问详解,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南。
  • vue2技术栈实现AI问答机器人功能(流式与非流式两种接口方法),Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法探究,Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法详解
  • 发表评论

    快捷回复:表情:
    评论列表 (暂无评论,0人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码