VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 15470|回复: 151

《实用C++》第21课 使用字符串处理函数操作字符数组

  [复制链接]
01_avatar_middle
最佳答案
35 
online_admins 发表于 2018-2-6 00:43:27 | 显示全部楼层 |阅读模式
1、目的:
之前也跟大家说过字符串在以后的编程过程中会非常频繁的用到,所以C/C++语言为了提升开发效率,本身提供了很多对字符串进行操作的函数,不用大家自己再实现。他们已经成为C/C++的标准,所以任何一个支持C/C++标准的编译器都支持这些函数的。他们被包含在 string.h 或 string 头文件中。所以要在代码中添加:
#include <string.h> //C语法
或者
#include <string> //C++语法

2、字符串连接函数:strcat
该函数的定义原型为:
char * strcat (char destination[], const char source[]);
相关的说明在这里:http://www.cplusplus.com/reference/cstring/strcat/
其作用就是将第二个参数的字符串连接到第一个参数的字符串结尾,所以要保证第一个参数的字符数组大小够用,能装的下第1个和第2个字符串的总长度才行,不然就会发生内存溢出啦!
返回值是第一个字符串的首地址,关于地址这个话题在下几节课会给大家讲解的。

代码举例:
char des[50] = "hello "; //保证des的空间足够大
char src[] = "cctry.com";
strcat(des, src);
cout << "des = " << des << endl;

问大家个问题,这里面des字符数组的大小最小能定义成多少?15?16?17?为什么呢?

3、字符串拷贝函数:strcpy
该函数的定义原型为:
char * strcpy( char destination[], const char source[]);
相关的说明在这里:http://www.cplusplus.com/reference/cstring/strcpy/
其作用就是将第2个参数的字符串拷贝到第一个参数的字符数组中,所以要保证第1个参数的字符数组大小够用。注意:第2个参数的结束符 '\0' 也会拷贝过去哦。
返回值是第一个字符串的首地址,关于地址这个话题在下几节课会给大家讲解的。

代码举例:
char des[50] = {0};
char src[] = "cctry.com";
strcpy(des, src);
cout << "des = " << des << endl;
问大家个问题,这里面des字符数组的大小最小能定义成多少?为什么呢?

4、字符串比较函数:strcmp
该函数的定义原型为:
int strcmp (const char str1[], const char str2[]);
相关的说明在这里:http://www.cplusplus.com/reference/cstring/strcmp/
其作用就是对比第1个和第2个参数的字符数组字符串,逐个字母比对,直到字符串结束。即比较每个字母的ASCII码值。
当第1个参数大于第2个参数,返回 > 0 的数,当第1个参数小于第2个参数,返回 < 0 的数,当第1个参数和第2个参数相等,返回0

代码举例:
char des[50] = "hello";
char src[] = "cctry.com";
int iret = strcmp(des, src);
cout << "iret = " << iret << endl;

5、字符串求长度函数:strlen
该函数的定义原型为:
size_t strlen (const char str[]);
相关说明在这里:http://www.cplusplus.com/reference/cstring/strlen/
其作用就是求得参数字符串的长度,通过返回值返回。

代码举例:
char des[50] = "hello";
int len = strlen(des);
cout << "len = " << len << endl;

这里面 len 的值是5,而不是50,为什么呢?50是des中总共能容得下的字符的个数,而不是实际字符串的长度。
所以这里面一个字符串占用的字节数和字符串的长度是两个不同的概念。

6、字符串的长度和占用字节数的区别:
char des[50] = "hello";
这个字符数组里面存的是一个字符串 hello,那么这个des字符数组所包含的字符串长度是:strlen(des)
那么,这个字符数组所占用的字节数呢?怎么求?sizeof(des)

int des[50];
sizeof(des) = ?

7、小作业:
不用系统提供的strcat函数,自己使用字符数组编写一个函数,实现两个字符串的连接功能。


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
教程在线观看地址:
https://www.bilibili.com/video/av38388453/?p=23
MP4高清视频下载地址:链接:https://pan.baidu.com/s/1OKan61p2LMAhplD4feV01Q 提取码:x7nl
本节课件下载(回复后可见):
游客,如果您要查看本帖隐藏内容请回复

备注:VIP会员可免费下载本站所有资源(点击查看)
提示:通过购买VC驿站U盘打包(点击查看)也可加入终身Vip会员^_^




上一篇:《实用C++》第20课 字符数组
下一篇:《实用C++》第22课 地址与指针
78_avatar_middle
最佳答案
1 
在线会员 发表于 2019-9-27 17:14:15 | 显示全部楼层
本帖最后由 muye12921 于 2019-9-27 17:18 编辑
  1. int my_strlen(const char* str)
  2. {
  3.     int i;
  4.     for (i = 0;; i++)
  5.         if (str[i] == '\0') break;

  6.     return i;
  7. }

  8. char* my_strcat(char* destination, const char* source, int buffer)
  9. {
  10.     int des_len = my_strlen(destination);
  11.     int source_len = my_strlen(source);

  12.     if (buffer <= des_len + source_len + 1) {
  13.         if (buffer <= des_len + 1) {
  14.             return destination;
  15.         }
  16.         else {
  17.             int i, j;
  18.             for (i = des_len, j = 0; i < buffer - 1; i++, j++)
  19.             {
  20.                 destination[i] = source[j];
  21.             }
  22.             destination[i] = '\0';
  23.         }
  24.     }
  25.     else {
  26.         int i, j;
  27.         for (i = des_len, j = 0; i < des_len + source_len; i++, j++)
  28.         {
  29.             destination[i] = source[j];
  30.         }
  31.         destination[i] = '\0';
  32.     }

  33.     return destination;
  34. }
复制代码

测试函数
  1. void testMyStrCat()
  2. {
  3.     char a[50] = "hello ";
  4.     char b[] = " what is your name?";


  5.     cout << "length a: " << my_strlen(a) << endl;
  6.     cout << "length b: " << my_strlen(b) << endl;
  7.     cout << "sizeof(a): " << sizeof(a) << endl;

  8.     my_strcat(a, b, sizeof(a));
  9.     cout << "连接后的字符串:" << a << " 长度为:" << my_strlen(a) << endl;
  10. }
复制代码

大概实现了一个相对安全的strcat版本和一个求字符串长度的方法my_strlen,但中文字符连接上还有问题。。。有空再改改
98_avatar_middle
最佳答案
0 
在线会员 发表于 2018-2-6 09:13:29 | 显示全部楼层
继续学习
51_avatar_middle
最佳答案
0 
online_vip 发表于 2018-2-7 07:29:12 | 显示全部楼层
支持syc老大
32_avatar_middle
最佳答案
0 
在线会员 发表于 2018-2-7 13:29:57 | 显示全部楼层
继续下载学习……
74_avatar_middle
最佳答案
0 
在线会员 发表于 2018-2-7 18:27:33 | 显示全部楼层
看看   
80_avatar_middle
最佳答案
0 
在线会员 发表于 2018-2-8 08:40:14 | 显示全部楼层
继续学习中...
65_avatar_middle
最佳答案
0 
在线会员 发表于 2018-2-8 10:16:46 | 显示全部楼层
Thanks&#9834;(&#65381;ω&#65381;)&#65417;  楼主威武
18_avatar_middle
最佳答案
0 
online_vip 发表于 2018-2-9 08:07:34 | 显示全部楼层
学习学习
78_avatar_middle
最佳答案
0 
在线会员 发表于 2018-2-9 09:13:57 | 显示全部楼层
新课程,不错,谢谢
13_avatar_middle
最佳答案
0 
online_vip 发表于 2018-2-10 13:21:25 | 显示全部楼层
hello world
22_avatar_middle
最佳答案
0 
online_vip 发表于 2018-2-10 18:24:26 | 显示全部楼层
继续下载学习……
07_avatar_middle
最佳答案
0 
在线会员 发表于 2018-2-11 08:30:50 | 显示全部楼层
多谢分享
49_avatar_middle
最佳答案
0 
在线会员 发表于 2018-2-11 21:05:34 | 显示全部楼层
rhf rhf rhf rhf
10_avatar_middle
最佳答案
0 
donate_vip 发表于 2018-2-12 12:31:55 | 显示全部楼层
今天来学习一下字符处理相关技术,谢谢老大分享
89_avatar_middle
最佳答案
0 
online_vip 发表于 2018-2-13 23:00:08 | 显示全部楼层
放松放松放松
82_avatar_middle
最佳答案
0 
online_vip 发表于 2018-2-14 14:03:02 | 显示全部楼层
重新学习
55_avatar_middle
最佳答案
0 
在线会员 发表于 2018-2-16 18:45:25 | 显示全部楼层
谢谢。。。。
75_avatar_middle
最佳答案
0 
在线会员 发表于 2018-2-21 09:23:01 | 显示全部楼层
字符串处理数组!
94_avatar_middle
最佳答案
0 
online_vip 发表于 2018-2-25 10:47:25 | 显示全部楼层
学习学习!!
22_avatar_middle
最佳答案
0 
在线会员 发表于 2018-2-27 21:04:39 | 显示全部楼层
感谢楼主分享
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-5-25 14:41

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表