strncpy函数的利用和模仿实现

打印 上一主题 下一主题

主题 1666|帖子 1666|积分 4998


目录
 1.头文件
 2.strncpy函数功能
2.1情况二:
3.strncpy函数(模仿实现)

   方源一把捉住VS2022,催动春秋产的气味,顷刻炼化!
  

 1.头文件

   strncpy函数的利用需要包罗头文件<string.h>
  
  1. #include<string.h>
复制代码

 2.strncpy函数功能


   简述:strncpy函数是一种用于复制字符串内容的函数
  
  strncpy函数吸收两个所在参数,和一个size_t类型的参数(这里指的是多少个字节),这里以图片讲解,第一个所在名为destination,第二个所在名为source
  
  我们知道,字符串只要给出其中一个字符的所在,那系统就会顺藤摸瓜出这个所在之后所有的字符
  
  strncpy的作用就是从第二个所在所对应的字符开始,统共复制num个字节的内容,粘贴到第一个所在所对应的字符串里
  示比方下:

   需要留意的是,strncpy函数在复制时不会自动补上'\0',我们可以看到,我们只复制了两个字节的内容,如果补上了'\0',那么字符'c'就会被替换成'\0'
  
  strncpy函数让复制几个字节就复制几个字节,不会多给你添任何东西
  
2.1情况二:

   如果想要复制的字节个数,arr2中不够呢?
  比如:
  1. #define _CRT_SECURE_NO_WARNINGS #include<stdio.h>#include<string.h>int main(){        char arr1[] = { "abcexxxxxkkkkk" };//5个x 5个k        char arr2[] = { "ghj" };        int sz = strlen(arr1);//sz = 14;        strncpy(arr1, arr2, 7);        for (int i = 0; i < sz; i++) {                printf("%c ", arr1[i]);        }}
复制代码
这样会打印什么?
    当利用strncpy函数时,如果源字符串(arr2)的大小不够 num,那就会在复制完arr2后,不停补充0,直到凑够num个,示比方下:
  1. #define _CRT_SECURE_NO_WARNINGS #include<stdio.h>#include<string.h>int main(){        char arr1[] = { "abcexxxxxkkkkk" };//5个x 5个k        char arr2[] = { "ghj" };        int sz = strlen(arr1);//sz = 14;        strncpy(arr1, arr2, 7);        //arr2只有4个(arr2中的'\0'可以复制上去),间隔7字节还差3个字节        //arr1 : ghj\0\0\0\0xxkkkkk        for (int i = 0; i < sz; i++) {                printf("%c ", arr1[i]);        }        //打印出 : ghj\0\0\0\0xxkkkkk}
复制代码
 截图示意:
  

  
  
3.strncpy函数(模仿实现)

代码如下:
  1. #define _CRT_SECURE_NO_WARNINGS #include<stdio.h>#include<string.h>void my_strncpy(char* arr1, char* arr2, size_t num, size_t sz2) {        int kd = sz2;        if (num <= sz2) {                while (num--) {                        *arr1++ = *arr2++;                }        }        //富足的情况        //不富足的情况下,一样复制,剩下的补0        else {                while (sz2--) {                        *arr1++ = *arr2++;                        //sz2 = 4, gbcexxxxx                        //sz2 = 3,ghcexxxxx                        //sz2 = 2,ghjexxxxx                        //sz2 = 1,ghj xxxxx                        //sz2 = 0,ghj ?xxxx                        //sz2 = -1            //while (sz2--) 在最后一次迭代时,sz2 的值为 0,依然会使循环体实行一次,但之后将 sz2 递减到 -1,从而退出循环。                           }                        if (sz2 == -1) {                        //sz2会等于-1                        while (num - kd > 0) {                                //7-4 == 3,想实行三次,那每一次kd++                                *arr1++ = '\0';                                //ghj  xxxx                                //ghj   xxx                                //ghj    xx                                kd++;                         }                                        }                        }}int main(){        char arr1[] = { "abcexxxxx" };//5个x        char arr2[] = { "ghj" };        int sz2 = strlen(arr2);//arr2的个数        int sz = strlen(arr1);        my_strncpy(arr1, arr2,7,sz2+1);        //想复制7个,那就多出3个0,应该打印ghj\0\0\0\0xx        for (int i = 0; i < sz; i++) {                printf("%c ", arr1[i]);                }}
复制代码






免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

汕尾海湾

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表