您的位置:首页 > 理论基础 > 数据结构算法

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

2015-07-21 20:12 549 查看
第十四章 字符串
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] … );


bufferchar型指针,指向将要写入的字符串的缓冲区。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字符串相关的笔试题(重要是思路,略)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: