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() ...
随机推荐
- lua OOP实现对象的链式调用
数学中的链式法则 http://sx.zxxk.com/ArticleInfo.aspx?InfoID=164649 链式微分法则:实数运算的链式法则:对数运算的链式法则:平行公理的链式法则:向量运算 ...
- 实例演示使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程-Web
实例演示使用RDIFramework.NET 框架的工作流组件 进行业务流程的定义—请假申请流程-Web 参考文章: RDIFramework.NET — 基于.NET的快速信息化系统开发框架 — 系 ...
- NSCalendar NSDateComponents
// NSCalendar // 获取当前日历 NSCalendar *calendar = [NSCalendar currentCalendar]; // 获取当前时间日期的各个值 NSDate ...
- network config
ifcfg-ens32 --static TYPE=Ethernet BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes ...
- C# 窗体(登录界面)
首先拖动一个 lable(写用户名) 后面 跟一个Textbox 再lable(写密码) 后面 跟一个Textbox(需设置一下属性—行为—useSystemPasswordChar(默认输入的密 ...
- Shell脚本关于屏幕输出的字符进行颜色控制的问题
文本终端的颜色可以使用“ANSI非常规字符序列”来生成.举例: echo -e "\033[44;37;5m ME \033[0m COOL" 以上命令设置背景成为蓝色,前景白色, ...
- [技术分享] .NET下 , 上传图片的处理方式 , 贴上代码 .
如题 , 直接上单代码 , AC代码 <!DOCTYPE HTML> <html> <head> <meta charset="utf-8" ...
- json学习小记
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- c++中endl的函义
c++中endl的函义是回车的函义,Enter
- 覆盖的面积(HDU 1255 线段树)
覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem D ...