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语言字符串,Re :C语言,c语言,开发语言

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

运行效果

c语言字符串,Re :C语言,c语言,开发语言

以上代码输出的结果是 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;
}

运行效果

c语言字符串,Re :C语言,c语言,开发语言

自己实现一个 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;
}

运行效果

c语言字符串,Re :C语言,c语言,开发语言

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

char *strcpy(char* dest, const char* src);
  1. 功 能: 将参数src字符串拷贝至参数dest所指的地址
  2. 返回值: 返回参数dest的字符串起始地址
  3. 复制完字符串后,在dest后追加0
  4. 如果参数dest所指的内存空间不够大,可能会造成缓冲溢出的错误情况

 自己实现一个 strcpy 函数

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

char *mystrcpy(char* dest,const char* src)
{   
    size_t i = 0;
    
    while (src[i] != '\0') {
      dest[i] = src[i];
      i++;
    }
    
    dest[i]='\0';
    
    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;
}

运行效果

c语言字符串,Re :C语言,c语言,开发语言

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

char * strncpy(char* dest,const char* src, const size_t n);
  1. 功能:把src前n字符的内容复制到dest中
  2. 返回值:dest字符串起始地址
  3. 如果src字符串长度小于n,则拷贝完字符串后,在dest后追加0,直到n个
  4. 如果src的长度大于等于n,就截取src的前n个字符,不会在dest后追加0
  5. dest必须有足够的空间放置n个字符,否则可能会造成缓冲溢出的错误情况

自己实现一个 strncpy 函数

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

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;i<len;i++) {
       dest[i] = src[i];
    }

    dest[i]='\0';

    return dest;
}

int main()
{
    char name[21];
    memset(name,0,sizeof(0));
    mystrncpy(name,"xiaoqiu",4);

    printf("strlen=%d\n",strlen(name)); // 4
    printf("sizeof=%d\n",sizeof(name)); // 21

    return 0;
}

运行效果

c语言字符串,Re :C语言,c语言,开发语言

4、字符串拼接(strcat)

char *strcat(char* dest,const char* src);
  1. 功能:将src字符串拼接到dest所指的字符串尾部
  2. 返回值:返回dest字符串起始地址
  3. dest最后原有的结尾字符0会被覆盖掉,并在连接后的字符串的尾部再增加一个0
  4. dest要有足够的空间来容纳要拼接的字符串,否则可能会造成缓冲溢出的错误情况

自己实现一个 strncpy 函数 

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

char *mystrcat(char* dest,const char* src)
{   
    int destlen = strlen(dest);
    
    int i = 0;
    
    for (i=0;i<strlen(src);i++) {
     dest[destlen+i]=src[i];
    }
    
    dest[destlen+i]='\0';
}

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

    char name2[21];
    memset(name2,0,sizeof(0));
    strcpy(name2,"hello");
    mystrcat(name2,name1);

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

    return 0;
}

运行效果

c语言字符串,Re :C语言,c语言,开发语言

 5、字符串拼接(strncat)

char *strncat (char* dest,const char* src, const size_t n);
  1. 功能:将src字符串的前n个字符拼接到dest所指的字符串尾部
  2. 返回值:返回dest字符串的起始地址
  3. 如果n大于等于字符串src的长度,那么将src全部追加到dest的尾部,如果n小于字符串src的长度,只追加src的前n个字符
  4. strncat会将dest字符串最后的0覆盖掉,字符追加完成后,再追加0
  5. dest要有足够的空间来容纳要拼接的字符串,否则可能会造成缓冲溢出的错误情况

自己实现一个 strncat 函数  

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

char *mystrncat(char* dest,const char* src,size_t n)
{
    /*  方法一
    int len = strlen(src);

    if (len > n) len = n;

    else if (len < n) len = strlen(src);
    */

    // 方法二
    int len = (strlen(src)>n)?n:strlen(src);


    int destlen = strlen(dest);

    int i = 0;

    for (i=0;i<len;i++) {
     dest[destlen+i]=src[i];
    }

    dest[destlen+i]='\0';
}

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

    char name2[21];
    memset(name2,0,sizeof(0));
    strcpy(name2,"hello");
    mystrncat(name2,name1,4);

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

    return 0;
}

运行效果

c语言字符串,Re :C语言,c语言,开发语言

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

int strcmp(const char *str1, const char *str2 );

功能:比较str1和str2的大小

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

自己实现一个strcmp 函数

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

int mystrcmp(const char *str1,const char *str2)
{    
     int i = 0;
     int len = 0;//  str1 和 str2 较短的字符串长度
     
     if ( strlen(str1) > strlen(str2) )  len = strlen(str2);
     
     else len = strlen(str1);
     
     for (i = 0;i < len;i++) {
       if (str1[i]==str2[i]) continue;
       else break;
     }
     
     // 两个字符串相等
     if ( (i==len) && (strlen(str1)==strlen(str2))  ) return 0;
     
     // 两个字符串不相等
     else if (str1[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;
}
                               

运行效果 

c语言字符串,Re :C语言,c语言,开发语言

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

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

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

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

自己实现一个strncmp函数

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

int mystrcmp(const char *str1,const char *str2,size_t n)
{   
    int i = 0;
    
    for (i = 0;i < n;i++) {
     if (str1[i]==str2[i]) continue;
     else break;
    }
    
    if (i==n) return 0;
    
    else if (str1[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;
}

运行效果

c语言字符串,Re :C语言,c语言,开发语言

7、字符查找(strchr、strrchr)

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

返回一个指向在字符串s中第一个出现c的位置,如果找不到,返回0

自己实现一个strchr函数

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

char *mystrchr(const char *s,const int c)
{   
    int i = 0;
    
    int len = strlen(s);
    
    for (i = 0;i<len;i++) {
       if (s[i]==c) 
       return (char *)s+i;
    }
    return 0;
}

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

    printf("%s\n",mystrchr(name1,'q'));

    return 0;
}

运行效果 

c语言字符串,Re :C语言,c语言,开发语言 

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

返回一个指向在字符串s中最后一个出现c的位置,如果找不到,返回0

自己实现一个strrchr函数

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

char *mystrrchr(const char *s,const int c)
{
    int i = 0;

    for (i = strlen(s)-1;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;
}

运行效果

c语言字符串,Re :C语言,c语言,开发语言  

8、字符串查找(strstr)

char *strstr(const char* str,const char* substr);
  1. 功能:检索子串在字符串中首次出现的位置
  2. 返回值:返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回0

 自己实现一个 strstr 函数

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

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语言字符串,Re :C语言,c语言,开发语言

 文章来源地址https://www.toymoban.com/news/detail-816557.html

到了这里,关于C语言字符串详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言——详解字符函数和字符串函数(一)

    Hi,铁子们好呀!今天博主来给大家更一篇C语言的字符函数和字符串函数~ 具体讲的内容如下: 前言: 在编程的过程中,我们经常要处理字符和字符串,C语言标准库中提供了一系列库函数,接下来我们就学习一下这些函数。 众所周知,C语言中提供了一系列的字符函数,这些

    2024年03月17日
    浏览(51)
  • C语言——详解字符函数和字符串数组(上)

    目录 一、strlen的使用和模拟实现 1.strlen()函数的介绍 2.strlen()函数的具体使用 3.strlen函数的注意事项 4.strlen函数的模拟实现 二、strcpy的使用和模拟实现 1.strcpy()函数的介绍 2.strcpy()函数的具体使用 3.strcpy()函数的注意事项 4.strcpy函数的模拟实现 三、strcat 的使用和模拟实现  1

    2024年01月16日
    浏览(54)
  • C语言字符串初始化详解:用常量字符串进行字符数组初始化

    简介 字符串初始化 用常量字符串 初始化过程 示范代码 结论 在C语言中,字符串被定义为字符数组。字符串的初始化是指将一个常量字符串复制到字符数组中。本文将详细介绍字符串的初始化方法,并提供相应的示范代码。 在C语言中,有几种常用的方法可以用常量字符串来

    2024年02月15日
    浏览(58)
  • Java语言:字符型的详解、字符串的比较

    目录 前言 一.字符型的知识 二.字符型比较大小 三.字符串比较 equals()方法 equalslgnoreCase()方法 compareTo() 方法 🎁博主介绍:博客名为tq02,已学C语言、JavaSE,目前学了MySQL和JavaWeb 🎥学习专栏:  C语言         JavaSE       MySQL基础 🎄博主链接:tq02的博客_CSDN博客-C语言,Ja

    2024年02月13日
    浏览(65)
  • 【C语言】字符与字符串---从入门到入土级详解

    🦄 个人主页 :修修修也 🎏 所属专栏 :C语言 ⚙️ 操作环境 : Visual Studio 2022 目录 一.字符类型和字符数组(串)简介 1.ASCII 2.定义,初始化,使用 1字符的定义及初始化 2字符串的定义及初始化 二.字符 1.字符的输入与输出 2.常见字符操作函数    1字符大小写转换    2字符类型

    2024年03月17日
    浏览(40)
  • 【进阶C语言】字符函数和字符串函数(万文详解)

    前言 C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。 字符串常量适用于那些对它不做修改的字符串函数. 今天将带来C语言函数的使用介绍 分为三部分供大家理解 如果这份博客对大家有帮助,希望

    2024年01月18日
    浏览(64)
  • 【C语言】【字符串函数】【超详解】【下】!!!

    字符串函数【上】: 【C语言】【字符串函数】【超详解】【上】!!!-CSDN博客 前言: 在上一篇中,我们已经详细讲解了C语言字符串函数中用到最多的几种函数的使用及其模拟实现,本篇我们就将学习C语言字符串函数中,一些非常实用但稍有难度的几个字符串函数。 1、

    2024年03月18日
    浏览(51)
  • C语言——字符串函数(七千字详解)

    目录 1、字符串函数 长度不受限制的字符串函数 1.1strlen 注意事项: strlen函数的使用  strlen函数的模拟实现  1.2strcpy 注意事项: strcpy函数的使用  strcpy函数的模拟实现  1.3strcat 注意事项 strcat函数的使用 strcat函数的模拟实现  1.4strcmp strcmp的返回值 strcmp函数的使用 strcmp函数

    2024年02月04日
    浏览(39)
  • C语言 strtok字符串分割函数详解

    strtok 函数的作用是比较独特的,可以用来对字符串进行分割,对于我们获取命令或者数据集合后的数据处理是不可或缺的一步。但是详细介绍 strtok 的博文很少,而且linux手册的介绍也比较简单,这边写篇博文记录一下学习到的这个函数的用法。 函数定义如下: 即从字符串

    2024年02月12日
    浏览(43)
  • C语言左旋字符串详解(付完整代码)

      目录 暴力求解 优雅求解 左旋字符串,实现一个函数,可以左旋字符串中的k个字符。 例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB  每左旋转1个字符串,旋转k次,这种方法效率比较低,因为在多次旋转过程中,某几个字符要多次移动。 把整个字符串从待旋转

    2024年02月10日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包