数据结构和设计模式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);

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字符串相关的笔试题(重要是思路,略)







0 0