数据结构和设计模式05(字符串)
来源:互联网 发布:java classloader原理 编辑:程序博客网 时间:2024/04/30 09:12
第十四章 字符串
1.字符串的转换
1.1 itoa:
函数原型:
char *itoa(int value,char *string,int radix)
返回指向转换后的字符串的指针,例子如下:
int number = 12345;char string[25];itoa(number, string, 10);printf("integer = %d string = %s\n", number, string);
函数原型:
int atoi(const char *nptr)原理:跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。举例:
char a[]=”-100”;char b[]=”456”;int c;c=atoi(a)+atoi(b);printf(c=%d\n”,c);引申:字符串转其他的类型,函数原型和atoi()的几乎一样,直接利用返回值就行。具体如下:
atof(将字符串转换成浮点型数)
atoi(将字符串转换成整型数)
atol(将字符串转换成长整型数)
strtod(将字符串转换成浮点数)
strtol(将字符串转换成长整型数)
strtoul(将字符串转换成无符号长整型数)
toascii(将整型数转换成合法的ASCII 码字符)
toupper(将小写字母转换成大写字母)
tolower(将大写字母转换成小写字母)
整数转化为字符串,可以加‘0’,在逆序,加‘0’就会隐性转化为char类型的数(数字必须在0~9之间才能正确)。
atoi(将字符串转换成整型数)
atol(将字符串转换成长整型数)
strtod(将字符串转换成浮点数)
strtol(将字符串转换成长整型数)
strtoul(将字符串转换成无符号长整型数)
toascii(将整型数转换成合法的ASCII 码字符)
toupper(将小写字母转换成大写字母)
tolower(将大写字母转换成小写字母)
double atof(const char *nptr);long atol(const char *nptr);double strtod(const char *nptr, char **endptr);1.3特殊情况
整数转化为字符串,可以加‘0’,在逆序,加‘0’就会隐性转化为char类型的数(数字必须在0~9之间才能正确)。
相反,字符串减去‘0’,则会编程整形,例子如下:
std::string tmp = "a";int b = 9;//大于10得到结果不正确:tmp += b + '0';tmp += ".jpg";std::cout << tmp << std::endl;//结果未a9.jpg;
补充:C语言的格式化,详细分析见:http://blog.csdn.net/ssihc0/article/details/5189119
首先,格式化的格式如下:
int sprintf( char *buffer, const char *format, [ argument] … );
buffer:char型指针,指向将要写入的字符串的缓冲区。format:格式化字符串。[argument]...:可选参数,可以是任何类型的数据。返回值:字符串长度(strlen)
例子:sprintf(s, "%f", 3.1415926); //产生"3.141593"
strcpy()首先分析函数源码,如下:
char * __cdecl strcpy(char * dst, const char * src){char * cp = dst;while (*cp++ = *src++); /* Copy src over dst */return(dst);}注意事项:a.由函数源码可知,strcpy函数是以'\0'位结束符,所以,如果src没有结束符,则会报错。
b.字符数组和字符串的区别:字符串默认加上结束符'\0',但是字符串数组最后一个并不要求一定是结束符'\0',这个由系统需要决定;
c.但是,字符串初始化时(与strcpy拷贝的不同),最后一个必须是结束符'\0';
d.结合上面的源码和注意事项,看看如下例子:
void test1(){char str[10];char*str1 = "0123456789";strcpy(str, str1);//越界,但是能正确运行,见注意事项b.cout << str << endl;}test2(){char str1[10], str2[10];for (int i = 0; i < 10; i++){str1[i] = 'a';}strcpy(str2, str1);//报错,见注意事项c.和a.,应该在这个语句钱添加str1[9]='\0';cout << str2 << endl;}
strcmp源码如下:
int __cdecl strcmp(const char * src,const char * dst){int ret = 0;while (!(ret = *(unsigned char *)src - *(unsigned char *)dst) && <strong><span style="color:#ff0000;">*dst</span></strong>)++src, ++dst;if (ret < 0)ret = -1;else if (ret > 0)ret = 1;return(ret);}由此可知,单个字符直接用符号(-,==等)比较大小(应该是ascii码)。strcmp函数用法就不举例子了。
void *memcpy(void *dest, const void *src, size_t n);//memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中,<span style="font-family: arial, 宋体, sans-serif; line-height: 24px; text-indent: 28px;"><span style="color:#333333;">函数返回指向dest的指针。</span><span style="color: rgb(51, 51, 51); font-family: arial, 宋体, sans-serif; line-height: 24px; text-indent: 28px;">如果目标数组destin本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址</span><span style="font-family: arial, 宋体, sans-serif; line-height: 24px; text-indent: 28px;"><span style="color:#ff0000;">增加到你要追加数据的地址</span></span><span style="color: rgb(51, 51, 51); font-family: arial, 宋体, sans-serif; line-height: 24px; text-indent: 28px;">.</span></span>void *memset(void *s, int ch, size_t n);//函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s
1.5 数组的初始化(略)
1.6字符串相关的笔试题(重要是思路,略)
0 0
- 数据结构和设计模式05(字符串)
- 2、数据结构和设计模式(数据结构基础、字符串、设计模式与软件测试)
- 数据结构和设计模式03(排序)
- 数据结构和设计模式01(数据结构的基础)
- 数据结构和设计模式02(树,图)
- 数据结构和设计模式04(hash表)
- 宝典——数据结构和设计模式
- 《数据结构与算法》和《设计模式》
- java设计模式前奏+jvm简介+数据结构字符串的复习
- 《数据结构》第四章 字符串和数组 教学设计
- 设计模式(数据结构)—— 迭代器模式
- 设计模式(数据结构)—— 组合模式
- 数据结构.字符串.模式匹配算法
- 数据结构c语言实现字符串定位(模式匹配)
- 大话数据结构十:字符串的模式匹配(BF算法)
- 大话数据结构十一:字符串的模式匹配(KMP算法)
- 大话数据结构十二:字符串的模式匹配(BM算法)
- 大话数据结构十:字符串的模式匹配(BF算法)
- windows install cython error: "unable to find vcvarsall.bat"
- java 线程死锁
- Cookie应用实例
- 【原创】机器学习算法之:决策树
- 基于Multisim的boost升压斩波电路仿真
- 数据结构和设计模式05(字符串)
- Apache配置代理的两种方式
- nyoj最长递增子序列
- 并查集(初级)小结
- uva 657 The die is cast(双重搜索)
- C语言入门学习小总结
- Unity3D ParticleSystem粒子系统(3.5版)【初级】
- servlet基础_1
- LeetCode || Search in Rotated Sorted Array II