C 风格字符串和strcpy方法的实现
C语言是面向过程的,所以它并没有所谓封装好的功能强大的string。但是麻雀虽小五脏俱全。在C中,我们一般用
const char* 类型来定义一个字面型字符串。
首先我们了解下C中的基本指针。指针是存储变量地址的变量。而我们主要来区别下数组指针和普通指针。
看一段代码:
char c = 'd'; char* ptr_c = &c; printf(ptr_c);
这段代码是能通过编译的,然而执行的时候会出现不可预期的错误。虽然printf接受的是一个const char* 类型的参数。但是显然不是所有的char* 类型的参数都是它所预期能接受的。
上述的ptr_c是一个指向单个字符char的地址。如果对其进行+ - 运算,那么获得的地址将是不可预期的。
我们修改一下:
]; ptr_c = cstring; *(ptr_c++) = *(ptr_c++) = 'b'; *(ptr_c) = printf( printf(cstring);
上述代码虽然简单,但是句句暗藏玄机。
1.cstring是数组的名字,但是创建数组的时候,他会自动创建一个指针。这个指针可以赋值给一个char类型的指针。是一个右值(所以也可以看成是头指针)。
这行代码等价于:
ptr_c = &cstring[];
此外,这个数组的所有元素的地址是按照一定的规则排列的,所以指针的+ -运算可以得到对应元素的地址。比如,第一个元素的地址+2就是第三个元素的地址,但计算的时候一定要注意不要越过数组的界限。
2.*(ptr_c++) 的操作步骤是先解引用,然后将指针+1。对于理解上很容易误解,很容易看成是先将指针+1再解引用。这是不对的。要注意。
3.一定注意:c语言的字符串约束是末尾字符是\0,也就是说满足末尾字符是\0的的字符数组就可以当作c字符串来使用。
4.同1,cstring解引用后会获得第1个元素的值。
5.c语言中所有const char* 类型的参数或者返回值,都可以当作是字符串。他们满足的约束也是尾字符是\0。所以这次我们传一个真正的字符串进去,printf(const char *)方法才能正确执行。
了解了这么多,相比大家早就对实现strcpy方法跃跃欲试。这是c最经典的一道面试题,同时也囊括了刚才介绍的不少知识点。
char* strcpy(char* dest, const char* src)
{
assert(dest != NULL && src != NULL);
char* ret = dest;
while(*(dest++) = *(src++) != '\0');
return ret;
}
最后说下,C中的字符串字面值常量,编译器将视他为const char*类型。所以可以直接赋值。
此外,const char* 被赋值后,这个值就不能再变化,我曾经试着作死但是明显失败了
const char* ntr = "ninij";
char* str = const_cast<char*> (ntr);
*str = 'a';
printf(ntr);//严重报错,一旦str被赋值,原ntr的结构被破坏!!慎重!!!
对此我们需要理解下const的作用:
常量指针,表述为“是常量的指针”,它首先应该是一个指针。
指针常量,表述为“是指针的常量”,它首先应该是一个常量。
常量指针 const char *p; p指向的内容不可变
指针常量 char* const p; p指向的地址不可变
C 风格字符串和strcpy方法的实现的更多相关文章
- c风格字符串
1.字符数组截取 有当然有了,应均包含在<string.h>中. 有strncpy,strncat.可以帮你从任何位置,取得任意合法长度的字符串. 用法基本同strcpy,strcat. ...
- 05_动手动脑之String.equals()方法的实现代码
Question: 请查看String.equals()方法的实现代码,注意学习其实现方法. Answer: java中的String.equals()方法的实现代码: equals()法是根类Obj ...
- C风格字符串与C++风格字符串
C风格字符串与C++风格字符串 C风格字符串:对字符串进行操作的 C 函数定义在头文件<cstring>中: 1. 字符串定义:char* result: 2. 字符串的最后一个字符是nu ...
- 动手动脑之查看String.equals()方法的实现代码及解释
动手动脑 请查看String.equals()方法的实现代码,注意学习其实现方法. 第一个是false,后三个是true. package stringtest; public class Strin ...
- OC:属性的内部实现原理、dealloc内释放实例变量、便利构造器方法的实现原理、collection的内存管理
代码: // // main.m #import <Foundation/Foundation.h> #import "Person.h" #import " ...
- c风格字符串函数
十一.C 风格字符串 1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat( ...
- string字符串转C风格字符串 进而转换为数字
要求如题 头文件stdlib.h中有一个函数atof() 可以将字符串转化为双精度浮点数(double) double atof(const char *nptr); 此字符串为C风格字符串,因此需要 ...
- C++ 标准头文件与C头文件区别与联系以及C风格字符串
1.cstdlib是C++里面的一个常用头文件, 等价于C中的<stdlib.h>. 2.一般一个带“.h” 扩展名的库文件,比如iostream.h.这是延续C语言的,为了兼容C.在新标 ...
- 标准库string与C风格字符串
返回字符串的长度 string标准库 #include<iostream> #include<cstring> using namespace std; int main() ...
随机推荐
- 个人对AutoResetEvent和ManualResetEvent的理解(转载)
仅个人见解,不对之处请指正,谢谢. 一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方 ...
- Adding Swagger to Web API project
Adding Swagger to Web API project. All source code for this series can be found here. When you creat ...
- 20145320《Java程序设计》第五次实验报告
20145320<Java程序设计>第五次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1453 指导教师:娄嘉鹏 实验日期:2016.05.06 18: ...
- 用oop分析场景,写出代码。房间里,有人、猫、老鼠在睡觉,然后猫醒了发出叫声,叫声惊醒了人,人从床上坐起来,惊醒了老鼠,老鼠开始逃跑。
首先分析有哪些类: 应该有房子.动物类.人类.猫类.老鼠类. 房子不仅仅是一个容器,因为猫在房子里叫,惊醒了人和老鼠,所以猫叫是一个事件,通过这个事件触发人和老鼠的惊醒. 可以定义一个委托,利用委托绑 ...
- Azure Table storage 之改进DynamicTableEntity类为其添加动态语言扩展
在之前的一篇文章中提到,storage类库中包含一个可以用来动态获取Azure table storage 表结构的类-DynamicTableEntity. 我们可以通过这个类,我们无需为每一个表提 ...
- C# 获取SqLite数据库表信息以及获取表内字段信息
#region 最新数据表信息显示事件 /// <summary> /// 最新数据表信息显示事件 /// </summary> /// <param name=&quo ...
- android开源项目总汇
http://www.cnblogs.com/wanqieddy/p/3709466.html
- Unity-Animator深入系列总索引
花了不少时间完成了这篇Unity Animator学习系列文章,其中大多数内容都来自个人实践,包括API部分很多都是亲测,期望和网上的诸多教程达到互补. 相关参考文档 Unity Animator官方 ...
- sublime 自动编译
Tools --> Build System --> New: { "shell_cmd": "cc.bat \"$file\"" ...
- JAVA线程同步辅助类Exchanger-交换
可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchange 方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象.Exchanger 可能被视为 Synchro ...