【2016.3.21】关于字符串的一点总结
2016-03-22 00:00
260 查看
今天重点学习了一下关于字符串的一些知识点,总结一下如下:
具体实现如下:
其中
不太好理解,可以理解为下面两种方式:
实际运行结果如下:
可以看到源字符串即便是声明成const还是被截掉了一部分。原因在于目标字符串空间不够。先看一下s[]和d[]的地址是多少。
运行结果:
可以看到s的地址是2686694,d的地址是2686690,因此有下图:
因此,d[]=”123456789\0”, s[] =”56789\0789\0”。输出是遇到\0即结束输出。
free()函数与malloc()配套使用,原型为 void free(void* p)作用是释放p所指的内存区域。
1.’\0’的ASCII值为0
可以利用这个特性判断字符串是否到末尾了。假设有字符数组str[],下面的while()可以判断字符数组是否结束。int i = 0; while(str[i]) { printf("%c",str[i]); i++; }
2.关于strcpy函数
a).strcpy函数的原型
char *strcpy(char *strDest,const char *strSrc);
具体实现如下:
#include<assert.h> //包含宏 ... char *strcpy(char* strDest,const char* strSrc) { assert((strDest!=NULL)&&(strSrc!=NULL)); char* temp = strDest; while((*strDest++=*strSrc++)!='\0') return temp; }
其中
while((*strDest++=*strSrc++)!='\0')
不太好理解,可以理解为下面两种方式:
//第一种 while(1) { char r; *temp= *strSrc; temp++; strSrc++; r = *strSrc; if( '\0' == r ) break; }
//第二种 while ( *strSrc != '\0' ) { *temp++ = *strSrc++; } *strDestCopy=‘\0’;
b).void assert(int expression)函数
这个函数判断expression的值是否为真,如果值为真,则跳过,接着执行下一条语句,如果其值为假,则向stderr打印一条出错消息,然后通过调用abort函数来终止程序。c).char strcpy(char strDest,char* strSrc)的()里面已经实现了对源字符串到目标字符串的复制,为什么还要返回char*?
答:是为了实现链式表达式,返回具体值,就像下面这样:int length =strlen(strcpy(strDest,"hello world"));
d).在使用strcpy()函数时,必须预先为目标字符串分配足够的空间。
例:下面的程序会出现什么问题?[美国某著名软件公司面试题]#include <iostream> #include <cstdio> int main(void) { char s[]="123456789"; char d[]="123"; strcpy(d,s); printf("%s,\n%s",d,s); return 0; }
实际运行结果如下:
可以看到源字符串即便是声明成const还是被截掉了一部分。原因在于目标字符串空间不够。先看一下s[]和d[]的地址是多少。
#include <iostream> #include <cstdio> int main(void) { char s[]="123456789"; char d[]="123"; //strcpy(d,s); printf("address of s: %ld\n",(long int)&s); printf("address of d: %ld\n",(long int)&d); return 0; }
运行结果:
可以看到s的地址是2686694,d的地址是2686690,因此有下图:
因此,d[]=”123456789\0”, s[] =”56789\0789\0”。输出是遇到\0即结束输出。
3.malloc()函数
malloc函数的原型为:void* malloc(unsigned int size);其作用是在内存的动态存储区中分配一个长度为size的连续空间。参数是一个无符号的整型数,返回值是一个指向所分配的连续存储域的起始地址的指针。如果函数没有成功分配空间,则会返回一个NULL并执行相应的操作。free()函数与malloc()配套使用,原型为 void free(void* p)作用是释放p所指的内存区域。
相关文章推荐
- http协议Connection:Keep-alive 是怎么用,一次连接可以处理多个请求?
- 推荐几个常用的Git代码托管平台
- 通信协议:HTTP、TCP、UDP
- C++添加一个头文件和extern以及全局变量和局部变量问题(16.3.19上机的一小题)
- JavaScript动态设置table的高度
- 精通iOS移动开发(Xcode7&Swift2;):多媒体相关技术
- Python中的yield用法
- activity生命周期
- Redis对于Key的常用操作,基于版本3.0.7
- bash
- 创建SSH互相关系
- 浅谈命令查询职责分离(CQRS)模式
- JS 移动端开发框架
- [Leetcode]237. Delete Node in a Linked List
- 读《构建之法-现代软件工程》前三张后感
- Android SDK Manager国内下载缓慢的问题
- Android开发环境配置(以windows为例)
- win7下无法创建django工程
- VIEWGOOD(远古)助力高校网络电视台建设
- linux(unbutn)安装java,java升级