长度受限制的字符串函数详解(strncpy,strncat,strncmp)

简介: 长度受限制的字符串函数详解(strncpy,strncat,strncmp)

1.另类字符串拷贝函数strncpy


对于字符串的拷贝函数:strcpy函数,笔者在之前已经有过详细的讲解!!有意者请参考链接:字符串拷贝函数:strcpy的详解及模拟实现_念君思宁的博客-CSDN博客但是这篇博客讲解的仍是字符串拷贝函数!!这两个函数有什么不同呢???请跟着笔者思路来进行走下去!!


0a2653c851af460fa595bd959398a8f1.png


char * strncpy ( char * destination, const char * source, size_t num )

在该段代码中:destination是指:目标空间;source 是指:源头; num是指: 限制拷贝的字符数!因此,全部合起来的意思大致为:从源头开始,拷贝num个到目标空间里面!


下面请看笔者的代码:简单详解一下:


#include <stdio.h>
#include <string.h>
int main()
{
  char arr1[20] = "abcdef";
  char arr2[] = "xxx";
  strncpy(arr1, arr2, 2);
  printf("%s\n", arr1);
  return 1;
}

对于上述代码的运行结果……其实各位老铁都能想象的出来!毕竟,笔者对于strncpy的语法部分已经讲解的很清楚了!!代码的运行结果为:


2d65d23f6d4748949b924e4057485923.png


但是,疑问也随之而来!!到底还要不要拷贝'\0'呢??疑惑!!!其实这个疑惑,可以经过我们的VS调试可以看出来!!请看……


调试之前的结果为:


6de278e6d6694ce5bb08e7e842b7e74b.png


调试之后的结果为:


12c3b7f3f8814309a195c64f051d4445.png


因此,关于是否拷贝'\0'这个问题的答案是显而易见的:不拷贝!!


但是对于num请不要滥用,否则将会出现错误……请看案列:


#include <stdio.h>
#include <string.h>
int main()
{
  char arr1[20] = "abcdef";
  char arr2[] = "xxx";
  strncpy(arr1, arr2, 8);
  //这里面的num为8,已经超过arr2的大小!!
  printf("%s\n", arr1);
  return 1;
}

上述的该段代码就是一个错误的案列,请各位老铁不要模仿!!至于代码的运行情况,我们可以在调试的过程中观察出来!!


调试前的运行情况为:


34e8d716411043c08c7ffba9fbba23de.png


调试之后的运行情况为:


92ba0822ed0b46e1ae72df8a17d3a45b.png


这是一段及其不负责的写法!请不要参考借鉴!!请按照规范来进行答题!!


综上所述:我们可以总结出来一下规律:


拷贝num个字符串,从源字符串到目标空间,但是,如果源字符串的长度小于num,则拷贝完,源字符串之后,在目标空间的后面加'\0', 直到num个!!


2.另类字符串追加函数:strncat


d79b274929334152a6d38be91e2d1be3.png


char * strncpy ( char * destination, const char * source, size_t num )

对于上述语法中:destination 是指:目标空间,cource 是指:源头!num是指个数!因此,总的来说:是将源头的num个字符追加在目标空间!


对于该另类字符串追加函数(strncat)的使用:请详见下列代码:


#include <stdio.h>
#include <string.h>
int main()
{
  char arr1[20] = "abcdef";
  char arr2[] = "wang";
  strncat(arr1, arr2, 2);
  printf("%s\n", arr1);
  return 0;
}

对于上述代码,就是另类字符串追加函数strncat的使用!!因此,代码的运行结果想必大家也是在心里面直接就能想象的出来!在此就不做过多的讲解!请看代码的运行结果为:


dfc80ca9d8004e6c9ddc00e8448ffc6a.png


那么疑问也随之而来:对于上述代码,在追加的时候,会不会追加'\0'在后面???


因此,我们可以将上述的代码进行简单的更改:arr1[20]="abcdef\0qqqq"  请参考……


#include <stdio.h>
#include <string.h>
int main()
{
  char arr1[20] = "abcdef\0qqqq";
  char arr2[] = "wang";
  strncat(arr1, arr2, 2);
  printf("%s\n", arr1);
  return 0;
}

对于上述代码的运行结果:


0a2653c851af460fa595bd959398a8f1.png


这样我们就可以通过调试来观察是否追加'\0'了!!


2d65d23f6d4748949b924e4057485923.png


调试到最后,结果为:


6de278e6d6694ce5bb08e7e842b7e74b.png


根据上述的调试截图,我们可以看出来:追加了'\0'!!!


因此,对于上述的总结有:strncat字符串追加函数让我追加num个,我就追加num个,追加完就停下来,默认'\0'!!!


那么思考一下!!strncat函数,是否可以实现自己追加自己呢???


答案也是显而易见的:可以实现自己追加自己!


下面请参考一下代码:


#include <stdio.h>
#include <string.h>
int main()
{
  char arr1[20] = "abcd";
  strncat(arr1, arr1, 4);
  printf("%s\n", arr1);
  return 0;
}

对于这个代码,可以实现字符串自己追加自己!!不信的各位老铁,请耐心欣赏笔者之后的截图证明!!


证明一下:strncat函数可以实现自己追加自己的调试……


12c3b7f3f8814309a195c64f051d4445.png


调试之后的结果为:


34e8d716411043c08c7ffba9fbba23de.png


代码的运行结果为:


92ba0822ed0b46e1ae72df8a17d3a45b.png


因此,strncat函数,可以实现自己追加自己!!


3.strncmp另类字符串比较函数!!



int strncmp ( const char * str1, const char * str2, size_t num )

上述语法的简单意思为:将str1 与 str2中的num个字符进行比较!!


返回类型为int(整型)!!


str1 > str2  返回一个大于0的数字:1


str1 < str2  返回一个小于0的数字:-1


str1 < str2  返回0



对于这个情况,想必读者也能很好的理解!!


#include <stdio.h>
#include <string.h>
int main()
{
  char arr1[] = "abcdef";
  char arr2[] = "abq";
  char arr3[] = "abcd";
  char arr4[] = "abc";
  char arr5[] = "abc";
  char arr6[] = "abc";
  int ret = strncmp(arr1, arr2,3);
  if (ret > 0)
  {
  printf("arr1>arr2\n");
  }
  else if (ret < 0)
  {
  printf("arr1<arr2\n");
  }
  else
  {
  printf("arr1==arr2\n");
  }
  return 0;
}


这段代码也能诠释strncmp函数的返回值!!


代码的运行结果为:


dfc80ca9d8004e6c9ddc00e8448ffc6a.png


到此为止:长度受限制的字符串函数详解(strncpy,strncat,strncmp)已经讲解完毕!!!


相关文章
|
5月前
|
C语言
字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现
字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现
|
5月前
|
Java 编译器 C语言
深入了解字符(串)函数 -- -- 字符(串)函数的实现(strlen、strcpy、strcmp、strcat、strstr、)内存函数的实现(memcpy、memmove)
深入了解字符(串)函数 -- -- 字符(串)函数的实现(strlen、strcpy、strcmp、strcat、strstr、)内存函数的实现(memcpy、memmove)
40 0
|
5月前
|
C语言
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
C语言:字符函数和字符串函数(strlen strcat strcmp strncmp等函数和模拟实现)
|
5月前
|
C语言
[字符串和内存函数]strcat和strncat的区别
[字符串和内存函数]strcat和strncat的区别
44 0
C实现字符操作函数,strcpy, strcat, strcmp, memcpy
C实现字符操作函数,strcpy, strcat, strcmp, memcpy
43 0
|
5月前
|
C语言
深入理解字符串函数和字符函数(islower和isupper、tolower和toupper、strlen、strcpy、strcat、strcmp)(一)
深入理解字符串函数和字符函数(islower和isupper、tolower和toupper、strlen、strcpy、strcat、strcmp)(一)
|
5月前
|
C语言
深入理解字符串函数(strstr、strtok、strerror)(二)
深入理解字符串函数(strstr、strtok、strerror)(二)
|
编译器 Linux C语言
【C语言】字符串函数的介绍二( strcmp、strncpy、strncat、strncmp)
【C语言】字符串函数的介绍二( strcmp、strncpy、strncat、strncmp)
93 0
|
算法 C语言
你应该知道的C语言干货(4)(strncpy,strncmp,strncat,strstr,strtok)
该库函数作用和strcpy很相似,不同点在于
63 0
你应该知道的C语言干货(4)(strncpy,strncmp,strncat,strstr,strtok)
字符串函数strncmp
字符串函数strncmp
112 1