经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
C风格字符串
来源:cnblogs  作者:清光照归途  时间:2023/7/10 9:51:49  对本文有异议

image

C风格字符串

关于C风格字符串的问题

?C++有string为什么还要学习C风格字符串?

  1. 某些场景使用C风格字符串更方便、更高效
  2. C标准库、Linux库 、开源库和数据库的接口函数,一定有C语言但不一定有C++(MySQL的接口函数只有C而没有C++)
  3. String是类,封装了C风格字符串(学习C风格字符串能帮助理解String类)

C中字符数组与字符串的区别

C中字符串的末尾会有**'/0' ?**,而字符数组没有

  1. char name[21]; //字符串,最多存放20个英文字符或10个中文字符,最后一个字符为 ' /0 '

C风格字符串的使用

字符串的初始化

  1. char name[11]; //未初始化,其值为垃圾直
  2. char name[11] = "Hello"; //初始化为Hello,系统自动在末尾添加'/0'
  3. char name[11] = {"Hello"}; //初始化为Hello,系统自动在末尾添加'/0'
  4. char name[] = {"Hello"}; //初始化为Hello,系统自动在末尾添加'/0'
  5. char name[11] {"Hello"}; //初始化为Hello,系统自动在末尾添加'/0'(C++ 11 标准)
  6. char name[11] = {0}; //全部元素初始化为0

清空字符串

使用memset()?函数清空字符串

语法:memset(字符数组的首地址即数组名,0,数组内存的空间大小)

  1. char name[10];
  2. memset(name,0,sizeof(name));
  3. //结果
  4. 0 0 0 0 0 0 0 0 0 0

字符串复制或赋值

?C语言字符串不能用" = "赋值

strcpy()函数

语法:strcpy(目标字符串,源字符串)

返回值:返回目标字符串的首地址

?复制完字符串后,会自动在目标字符串后面追加' /0 '

  1. 如果目标字符串所指向的内存不够大,则会导致数组越界
  1. char name[11] = {"Hello"};
  2. char namecpy[11];
  3. strcpy(namecpy,name);
  4. //结果
  5. namecpy[11]——>Hello

strncpy()函数

语法:strncpy(目标字符串,源字符串,n个字符)

返回值:返回目标字符串的首地址

?如果源字符串小于n,则拷贝完后会在目标字符串后追加' /0 '

  1. 如果源字符串大于或等于n,则截取前n个字符,且不会再目标字符串后追加' /0 '
  2. 如果目标字符串所指向的内存不够大,则会导致数组越界

  1. char name[11] = {"Hello"};
  2. char namecpy[11];
  3. strcpy(namecpy,name,3);
  4. //结果
  5. namecpy[11]——>Hel

?

字符串长度

语法:strlen(字符串的首地址即字符串名)

  1. char name [11] = { "Hello" };
  2. cout << strlen(name) << endl;
  3. //输出结果
  4. 5 //检索到'/0'时结束

?

字符串拼接

strcat()函数

语法:strcat(目标字符串,源字符串) ??==目标字符串原有的'/0'会被覆盖掉==

  1. char firstname[10] = {"Hello"};
  2. char lastname[10] = {" World"};
  3. strcat(firstname,lastname);
  4. //运行结果
  5. Hello World

strncat()函数

语法:strcat(目标字符串,源字符串,n个字符) ??==目标字符串原有的'/0'会被覆盖掉==

  1. char firstname[10] = {"Hello"};
  2. char lastname[10] = {" World"};
  3. strcat(firstname,lastname2);
  4. //运行结果
  5. Hello Wo

?

字符串比较

目标字符串与源字符串(或源字符串前n个字符)比较 返回值
> 1(ASCII码的差)
= 0
< -1(ASCII码的差)

strcmp()函数

语法:strcmp(目标字符串,源字符串)

  1. char name1[10] = {"Hello"};
  2. char name2[10] = {"hello"};
  3. strcmp(name1,name2);
  4. //运行结果
  5. -32

strncmp()函数

语法:strcmp(目标字符串,源字符串,前n个字符)

  1. char name1[10] = {"Hello"};
  2. char name2[10] = {"hello"};
  3. strcmp(name1,name2,3);
  4. //运行结果
  5. -32

?

字符查找

strchr(字符串,要查找的字符) 【是从一个字符串str中第一次出现该字符character的位置】

strrchr(字符串,要查找的字符)【是从一个字符串str中最后一次出现该字符character的位置】

返回值:如果在字符串 str 中找到字符 c,则函数返回指向该字符的指针,存在和首地址相减,可以得到下标。如果未找到该字符则返回 NULL。

?

字符串查找

语法:strstr(字符串,子串)

返回值:返回子串在字符串中第一次出现的地址,没有返回0

?C风格字符串的注意事项

5?在VS中使用C风格字符串是应加上#define _CRT_SECURE_NO_WARNINGS?

?

1?字符串的结尾标志为'/0',在处理时会从起始位置开始搜索直到搜索到'/0'为止

不会判断数组越界的原因:

操作字符串的函数形参为指针,只存放了字符串的起始地址,没有字符串的长度参数,无法判断是否越界

2?结尾标识符'/0'后面都是垃圾值

3?字符串在每次使用前都要初始化

4?不要再子函数里面使用sizeof运算符(因为子函数中的参数为指针,总是占8字节(64位操作系统))

原文链接:https://www.cnblogs.com/huajianyizou/p/c-style-string-28qs0e.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号