C/C++字符函数和字符串函数详解————长度受限制的字符串函数

简介: C/C++字符函数和字符串函数详解————长度受限制的字符串函数

1.前言        

       在上一篇文章中我们讲过了长度不受限制的字符串函数,包括strlen函数,strcmp函数,strcpy函数,strcat函数,学过和没学过的老铁们可以点击长度不受限制的字符串函数

今天我们我们就讲讲长度受限制的字符串函数,包括strncpy函数,strncat函数,strncmp函数,在这些函数中长度受限制是需要我们加上要修改的字节数。还有一些特殊的函数包括strstr函数,strtok函数。今天就来看看我们的内容吧。

2.长度受限制的字符串函数

2.1strncpy函数

我们进入cplusplus函数可以看到strnpcy函数的参数。

       strncpy函数的返回类型是char*,他的参数是 char * destination, const char * source, size_t num,在这里对于source由于不需要进行修改,只是需要进行拷贝,所以加上const,对于size_num是需要将source字符串的num个字节进行拷贝到destination,在第一个字节处进行修改,详细的代码如下:

#include <stdio.h>
#include <string.h>
int main()
{
  char arr[] = "abcdefghigh";
  char brr[] = "zzzzz";
  strncpy(arr, brr, 4);
  printf("%s", arr);
  return 0;
}

我们运行查看

我们发现字符串arr的前4个字节修改为字符串的前4个字节。

2.2strncat函数

同样我们进入cplusplus函数查看它的参数。

       strncat函数的返回值是char*,它的参数是 char * destination, const char * source, size_t num

和函数strncpy函数,由于source函数不需要进行修改,所以用const函数进行修改,在size_t num是需要连接的字符的个数,详细的代码如下:

#include <stdio.h>
#include <string.h>
int main()
{
  char arr[100] = "abcdefghigh";
  char brr[] = "xzzzzz";
  strncat(arr, brr, 4);
  printf("%s", arr);
  return 0;
}

我们运行代码可以看到:

在这里我么的字符串brr是source,把他的前4个字符连接到字符串arr后面,同时拷贝一下‘\0’;

2.3strncmp函数

我们进入cplusplus网站

       我们可以看到strncmp的参数是const char * str1, const char * str2, size_t num,由于str1和str2不需要进行修改,只需要进行比较,所以用const进行修饰,size_t是需要比较的字符串的个数。对于strncmp函数的返回值是int类型,

        如果第一个大于第二个返回大于0的数据,如果第一个小于第二个返回小于0的数据,如果第一个等于第二个则返回0,注意这里的比较是对于前num个字符进行比较,比较的形式和前面的额strcmp一样,具体的代码演示如下:

#include <stdio.h>
#include <string.h>
int main()
{
  char arr[] = "abcdefghigh";
  char brr[] = "abce";
  int ret=strncmp(arr, brr, 4);
  printf("%d", ret);
  return 0;
}

我们运行可以看到:

函数的返回值是-1。

2.4小结

       对于这三个函数,他们和长度不受限制的类似,只是多了一个限制条件,这个限制条件是限制的source.也就是说num是几个就拷贝几个,里面的循环由遇到‘\0’的while循环,改为了for循环,判定是i<num。

3.特殊的字符串函数

3.1strstr函数

       strstr函数是一个查找子串的函数,它返回最早出现字串的位置,我们进入cplusplus网站进行查看,

       我们看第一条,它参数和返回值都用const进行修饰,事实上他们两条都一样,只是第一条用const进行修饰,让它的值不能改变,更加的安全,防止非法的修改。我们举个例子来感受一直strstr函数的应用,代码如下:

#include <stdio.h>
#include <string.h>
int main()
{
  char arr[] = "abcabcdefghigh";
  char brr[] = "abcd";
  char *crr=strstr(arr, brr);
  printf("%s", crr);
  return 0;
}

我们运行可以看到:

我们想要模拟实现,首先画一下它的思路:

       就是由str2和str1进行记录位置,s1和s2进行比较,不相等str1和s1进行移动,相等str1和str2不动,s1和s2进行移动,相等移动,不相同重新指向str1和str2 ,依次循环,直到str1遇到‘\0’,模拟实现如下:

#include <stdio.h>
char* my_strstr(char* arr, char* brr)
{
  char* str1 = arr, * s1 = arr, * str2 = brr, * s2 = brr;
  while (*str1)
  {
    if (*s2 == '\0')
    {
      return str1;
    }
    if (*s1 == *s2)
    {
      s1++;
      s2++;
    }
    else
    {
      str1++;
      s1 = str1;
      s2 = str2;
    }
  }
}
int main()
{
  char arr[] = "abcabcdef";
  char brr[] = "abcd";
  char* p = my_strstr(arr, brr);
  printf("%s", p);
  return 0;
}

3.2strtok函数

       

       我们可以看到,strtok函数返回类型是char*,它的参数是 、char * str, const char * delimiters,这个函数是字符串切割,需要两个字符串,第一个字符串中出现第二个字符串就会进行切割然后指向此段的首字符,具体的代码如下:

#include <string.h>
#include <stdio.h>
int main()
{
  char arr[] = "abc,abcd@efacd*add";
  char brr[] = ",@*";
  char* str = arr;
  for (str = strtok(arr, brr); str != NULL; str = strtok(NULL, brr))
  {
    printf("%s\n", str);
  }
  return 0;
}

今天的内容就结束了,希望大家可以一键三连。

目录
相关文章
|
1天前
|
安全 C语言 C++
C/C++字符串函数
C/C++字符串函数
|
15天前
|
编译器 C++
【C++核心】函数的应用和提高详解
这篇文章详细讲解了C++函数的定义、调用、值传递、常见样式、声明、分文件编写以及函数提高的内容,包括函数默认参数、占位参数、重载等高级用法。
15 3
|
2月前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法
20 1
|
2月前
|
C++
c++常见函数及技巧
C++编程中的一些常见函数和技巧,包括生成随机数的方法、制表技巧、获取数字的个位、十位、百位数的方法、字符串命名技巧、避免代码修改错误的技巧、暂停和等待用户信号的技巧、清屏命令、以及避免编译错误和逻辑错误的建议。
21 6
|
2月前
|
存储 C++
c++学习笔记05 函数
C++函数使用的详细学习笔记05,包括函数的基本格式、值传递、函数声明、以及如何在不同文件中组织函数代码的示例和技巧。
30 0
c++学习笔记05 函数
|
2月前
|
存储 C++
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
【C/C++学习笔记】string 类型的输入操作符和 getline 函数分别如何处理空白字符
33 0
|
2月前
|
Dart 编译器 API
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
Dart ffi 使用问题之在C++线程中无法直接调用Dart函数的问题如何解决
|
2月前
|
存储 算法 搜索推荐
【C++】类的默认成员函数
【C++】类的默认成员函数
|
2月前
|
JavaScript C++
【C++ visual studio】解决VS报错:error C2447: “{”: 缺少函数标题(是否是老式的形式表?)【亲测有效,无效捶我】
【C++ visual studio】解决VS报错:error C2447: “{”: 缺少函数标题(是否是老式的形式表?)【亲测有效,无效捶我】
|
3月前
|
Rust 编译器 测试技术
Rust与C++的区别及使用问题之Rust中函数参数传递的问题如何解决
Rust与C++的区别及使用问题之Rust中函数参数传递的问题如何解决