自定义字符串连接和复制并函数

版权声明:请尊重每一个人的劳动成果 https://blog.csdn.net/jamenu/article/details/84564103

在谭浩强的C语言设计中的第6章数组中
为我们介绍了几组字符串处理函数
前提
必须在使用前加上下面的头文件来调用库函数

#include <string.h>

1,strcat(字符串1,字符串2)将字符串2的元素连接到字符串1的末尾,将字符串1末尾的’\0’删除
现在我看以下具体用法

#include <stdio.h>
#include <string.h>
int main()
{
 char array[40]="The deep dark",a[20]="fantasies♂";
 
 strcat(array,a);
 
 puts(array);
}

在这里插入图片描述

2.strcpy(字符串1,字符串2)将字符串2的元素覆盖到字符串1
下面随便写个程序

#include <stdio.h>
#include <string.h>
int main()
{
 char a[25]="this is a blank array",b[20]="Put array b to a";
 
 strcpy(a,b);
 
 puts(a);
}

下面给出截图
在这里插入图片描述

3.strcmp(字符串1,字符串2)字符串1与字符串2的比较
比较是第1个字符ASCII表数值的比较,当第一个字符ASCII表值相等时,比第2个,以此类推
要注意这是个带返回值的函数
当str1>str2,返回一个正整数
当str1<str2,返回值是一个负整数
当str1=str2,返回值是0
以上的返回值可以作为标记使用,将在后面介绍
现在随便写个程序

#include <stdio.h>
#include <string.h>
int main()
{
 char a[25]="Fuck you!Leather man",b[15]="fuck you";
 
 printf("%d",strcmp(a,b));
}

在这里插入图片描述

4.strlen(字符数组名),用来检测字符数组的长度,但它检查的是有效字符数,不包括空字符,这就与sizeof不一样了
下面给出实列

#include <stdio.h>
#include <string.h>
int main()
{
 char a[15]={'k','o','b','e','m','a','n','b','a','\0'};
 
 char b[15]="what the fuck";
 puts(a);
 printf("\n");
 puts(b);
 printf("\n");
 
 printf("%d\n",sizeof(a));//注意看长度的多少
 
 printf("%d\n",strlen(a));
 
 printf("%d\n",sizeof(b));
 
 printf("%d\n",strlen(b));
 
 
}

在这里插入图片描述

这几个比较重要的字符串处理函数就复习到这里
下面是这篇博文的重点

如何不通过字符串处理函数达到字符串连接和复制的效果
1.strcpy字符串复制函数的实现
在之前的数组倒置中我们讲过一种方法
即将数组倒着赋值给一个空的数组;
再将倒置的数组反过来赋给要倒置的数组;这在我的第1篇博文中说过

现在要实现字符串的复制(strcpy)也和这个类似,只要将str2的元素赋给str1的相应元素就完成了覆盖,只用一个循环就可以完成;
下面给出操作代码

#include <stdio.h>
int main()
{
 char a[30],b[30];    //定义2个字符数组
 
 int i,j;
 
 printf("请输入第1个字符串:\n");
 
 for(i=0;i<30;i++)          //为字符数a组赋值
 {
      scanf("%c",&a[i]);
  
      if(a[i]=='\n')         //当输入回车时,将回车变成空字符然后跳出循环,为什么用循环而不用scanf("%s",a)的格式?这个我会在后面做解释
      {
            a[i]='\0';break;
      }
 }
 
 printf("请输入第2个字符串:\n");
 
 for(i=0;i<30;i++)        //同上,为字符数组b赋值
 {
      scanf("%c",&b[i]);
  
      if(b[i]=='\n')
      {
            b[i]='\0';break;
       }
 }
 
 for(i=0;i<30;i++)      //在这个循环中,将每一个字符数组b中的元素以**相同的下标**赋给a数组完成覆盖
 {
        a[i] = b[i];
  
        if(b[i]=='\0') //为什么在这里加一个条件判断,因为当数组b的第1个空字符赋给相应的数组a的元素时,就可以完成对数组a的覆盖,因为字符数组是不会输出空字符及之后字符的,这样可以减少运算量
        {
               break;
         }
 }
 
 printf("将字符串2复制到字符串1中去:\n");
 
 puts(a);
}

下面放出程序运行的截图
在这里插入图片描述

为了让大家更直观的感受,我将所有的字符数组改为由键盘输入

这里讨论以下我在上面代码中留下的问题
为什么不用scanf("%s",a)来输入?
我在写这个代码时试过这个方法
用scanf("%s",a)明显能使程序更为简洁
但在这种要输入2个字符串的情况下,
它会将空格作为字符串分割的边界,就像要输入两个整形用scanf("%d%d",a,b)
输入时必须要用一个空格分开 如88 99
下面给出将循环输入改为scanf输入字符串的程序;

#include <stdio.h>
int main()
{
 char a[30],b[30];
 
 int i,j;
 
 printf("请输入第1个字符串:\n");      //这看上去比上面的代码简洁了不少
 
 scanf("%s",a);
 
 printf("请输入第2个字符串:\n");
 
 scanf("%s",b);
 
 for(i=0;i<30;i++)//在这个循环中,将每一个字符数组b中的元素以**相同的下标**赋给a数组完成覆盖
 {
       a[i] = b[i];
  
       if(b[i]=='\0')
       {
              break;
       }
 }
 
 printf("将字符串2复制到字符串1中去:\n");
 
 puts(a);
}

下面给出程序运行的截图
在这里插入图片描述

这给我一个经验对字符串的输入要少用%s的格式
2.strcat字符串连接函数的实现
拿生活中的例子,我们要连接两个棍子,要把1根的开头绑在另一端的末尾
我们的字符串连接也是这个道理。把后面字符串连接在前面字符串的最后一个元素。

利用循环结构就可以完成任务
下面给出操作的代码

#include <stdio.h>
int main()
{
 char a[60],b[30];
 
 int i = 0,j = 0,k;
 
 printf("请输入字符串1:\n");
 
 for(i=0;i<60;i++)       //这个循环用来对a赋值
 {
        scanf("%c",&a[i]);
  
        if(a[i]=='\n')
        {
             a[i] = '\0';break;
        }
 }
 
 printf("请输入字符串2:\n");
 
 for(i=0;i<30;i++)   //这个循环用来给b赋值
 {
         scanf("%c",&b[i]);
  
         if(b[i]=='\n')
         {
                 b[i] = '\0';break;
         }
 }
 
 while(a[i]!='\0')  //这个循环找出字符串a中第一个空字符的位置,a[i]
 {
         i++;
 }
 while(b[j]!='\0')    //这个循环将字符串b中的有效字符接上字符串a的末尾,当循环到字符串b出现空字符时,跳出
 {
      a[i++] = b[j++];
 }
   a[i] ='\0';        //因为以上循环并没有在连接结束时在末尾加上空字符来结束,因此将最后一位加上空字符以结束
 
 printf("连接后为:\n");
 
 puts(a);
 
}

下面给出程序运行的截图
在这里插入图片描述

到现在,上面的自定义的字符串连接和复制都是在主函数中完成
值得注意的是字符串连接和复制都要保障建一个前字符数组的长度要大于后一个字符数组的长度

现在我们尝试把它写成子函数来调用
1.字符串连接函数strcat字符串连接函数
因为这个函数改变了主函数的数值,因此不仅可以数组名做形参也可以用指针来做形参

下面给出操作代码

#include <stdio.h>
void strcat(char a[],char b[]);     //函数声明
int main()
{
 char a[60],b[30];
 
 int i = 0,j = 0,k;
 
 printf("请输入字符串1:\n");
 
 for(i=0;i<60;i++)
 {
       scanf("%c",&a[i]);
  
       if(a[i]=='\n')
       {
             a[i] = '\0';break;
       }
 }
 printf("请输入字符串2:\n");
 
 for(i=0;i<30;i++)
 {
         scanf("%c",&b[i]);
  
         if(b[i]=='\n')
         {
              b[i] = '\0';break;
         }
 }
 
 printf("连接后的字符串为:\n");
 
 
 strcat(a,b);         //调用字符串连接函数
 puts(a);
}
void strcat(char a[],char b[])   //字符串连接函数的定义
{
 int i = 0,j = 0;
 
 while(a[i]!='\0')  //这个循环找出字符串a中第一个空字符的位置,a[i]
 {
      i++;
 }
 while(b[j]!='\0')//这个循环将字符串b中的有效字符接上字符串a的末尾,当循环到字符串b出现空字符时,跳出
 {
     a[i++]=b[j++];
 }
 a[i]='\0';
 
}

我们再用同一种方法来写字符串复制函数
下面给出操作代码

#include <stdio.h>
void strcpy(char a[],char b[]);    //函数声明
int main()
{
 char a[60],b[30];
 
 int i = 0,j = 0,k;
 
 printf("请输入字符串1:\n");
 
 for(i=0;i<60;i++)
 {
      scanf("%c",&a[i]);
  
      if(a[i]=='\n')
      {
            a[i] = '\0';break;
      }
 }
 printf("请输入字符串2:\n");
 
 for(i=0;i<30;i++)
 {
       scanf("%c",&b[i]);
  
       if(b[i]=='\n')
       {
            b[i] = '\0';break;
       }
 }
 printf("将字符串2复制到字符串1中后:\n");
 
 strcpy(a,b);//调用函数
 
 puts(a); 
}
void strcpy(char a[],char b[])// 定义复制函数
{
 int i,j;
 
 for(i=0;i<30;i++)//循环覆盖即可
 {
      a[i] = b[i];
 } 
 
}

由于时间缘故,不能今天放出用指针做参数的方法,这将会在过几天在这篇帖子更新

猜你喜欢

转载自blog.csdn.net/jamenu/article/details/84564103