数据结构和设计模式05(字符串)
2015-07-21 20:12
549 查看
第十四章 字符串
1.字符串的转换
1.1 itoa:
函数原型:
返回指向转换后的字符串的指针,例子如下:
1.2 atoi
函数原型:
原理:跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回。举例:
引申:字符串转其他的类型,函数原型和atoi()的几乎一样,直接利用返回值就行。具体如下:
atof(将字符串转换成浮点型数)
atoi(将字符串转换成整型数)
atol(将字符串转换成长整型数)
strtod(将字符串转换成浮点数)
strtol(将字符串转换成长整型数)
strtoul(将字符串转换成无符号长整型数)
toascii(将整型数转换成合法的ASCII 码字符)
toupper(将小写字母转换成大写字母)
tolower(将大写字母转换成小写字母)
整数转化为字符串,可以加‘0’,在逆序,加‘0’就会隐性转化为char类型的数(数字必须在0~9之间才能正确)。
相反,字符串减去‘0’,则会编程整形,例子如下:
补充:C语言的格式化,详细分析见:http://blog.csdn.net/ssihc0/article/details/5189119
首先,格式化的格式如下:
buffer:char型指针,指向将要写入的字符串的缓冲区。format:格式化字符串。[argument]...:可选参数,可以是任何类型的数据。返回值:字符串长度(strlen)
例子:
1.4 字符数组和strcpy,memcpy,memset,strcmp.
strcpy()首先分析函数源码,如下:
b.字符数组和字符串的区别:字符串默认加上结束符'\0',但是字符串数组最后一个并不要求一定是结束符'\0',这个由系统需要决定;
c.但是,字符串初始化时(与strcpy拷贝的不同),最后一个必须是结束符'\0';
d.结合上面的源码和注意事项,看看如下例子:
strcmp源码如下:
由此可知,单个字符直接用符号(-,==等)比较大小(应该是ascii码)。strcmp函数用法就不举例子了。
1.5 数组的初始化(略)
1.6字符串相关的笔试题(重要是思路,略)
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);
1.2 atoi
函数原型:
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(将大写字母转换成小写字母)
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"
1.4 字符数组和strcpy,memcpy,memset,strcmp.
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字符串相关的笔试题(重要是思路,略)
相关文章推荐
- HDU 5016 Mart Master II (树上点分治)
- 数据结构和设计模式04(hash表)
- 数据结构——士兵队列训练问题
- 数据结构——队列问题——解题分析
- JAVA学习数据结构
- 【玩转cocos2d-x之二十六】数据结构CCDictionary
- 【玩转cocos2d-x之二十五】数据结构CCArray
- 数据结构——栈
- 数据结构—栈
- 宝典——数据结构和设计模式
- 数据结构学习笔记(1)
- 数据结构与算法-为什么要使用算法
- 数据结构与算法-为什么要使用算法
- 数据结构导论
- 扩充的数据结构-Order Statistic Tree
- 基础数据结构priority_queue用法
- Java数据结构-线性表之队列
- Java数据结构-线性表之栈(顺序栈和链栈)
- 数据结构(一):数据结构的基本概念和算法的时间和空间复杂度
- 课程笔记 06:数据结构(清华) 列表-节点