数据结构和设计模式05(字符串)

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







你可能感兴趣的:(数据结构和设计模式05(字符串))