字符串处理2

来源:互联网 发布:驾校数据库 编辑:程序博客网 时间:2024/06/03 18:44

1.menccpy(void *dest,const void *src,int c,size_t n)

从src所指向的对象复制n个字符到dest所指向的对象中,如果复制过程中遇到了c则停止复制,如果存在c则返回指向c下一个位置的指针若不存在则返回NULL。

问题:上边的原型是书中给的,可是查了网上的内容发现函数原型是:原型:extern void *memccpy(void *dest, void *src, unsigned char ch, unsigned int count);

也就是说是可以使用char类型作为停止字符的。

#include <iostream>using namespace std;int main(){        char a[] = "string[a]";         char b[] = "string(b)";         memccpy(a, b, 'i', sizeof(b));         printf("memccpy():%s\n", a); getchar();return 0;}

输出结果为:string[a]也就是说后面的就没有在复制。

但是这里遇到了一个比较有趣的现象,我们知道cout和printf重载了一些字符串的输出方法,若cout和printf后面的参数为数组名或者是指针则输出这个数组或字符串。在使用memccpy()函数时,总是在末尾出现乱码,后来发现是我分配的空间比src要大。后来就想为malloc的这一部分内存初始化,但奇怪的地方出现了具体代码为:

#include <iostream>using namespace std;int main(){char *a = "abcd3efghi";char *b = (char *)malloc(15*sizeof(char));char *d;d = b;for(int i=0;i<15;i++){*d = 'm';d++;}char *e;e = b;memccpy(b,a,3,5);cout<<a<<endl;cout<<b<<endl;cout<<e<<endl;free(b);b = NULL;getchar();return 0;}

若char *e;e =  b;放在初始化的前面则输出的e还是乱码,结果如下:


如果放在初始化的后面,结果为:


不知道为什么?有知道希望告知下。

后来继续看发现有一个函数可以直接对内存初始化,后面说。

2.void * memcpy(void *dest,const void *src,size_t n)
从src中复制n个字符到dest中。其他的和menccpy一样。

但是这两个方法都不考虑内存重叠也就是说内存重叠在这两个方法里面都未定义,因此使用这两个方法时要确定不会发生内存重叠。否则还是使用memmov()。

3.void * memmove(void *dest,condt void *src,size_t n)

从src所指向的对象复制n个字符到dest所指向的对象中,效果和memcpy一样,只是增加了内存重叠的检测。

4.char * stpcpy(char *dest,char *src)

同样strcpy也是不检测内存重叠的,因此相应的会有一个检测内存重叠的方法,这个方法就是stpcpy。效果和strcpy一样,同样只是增加了内存重叠的检测。

5。char *strcat(char *dest,const char *src)

将字符串src添加到dest尾部,覆盖dest的‘\0’。

6.char * strlwr(char *s)

char * strupr(char *s)

将字符串s全部转成小写和大写。

7.char *strset(char *s,char c)

将字符串初始化全部为c,本来以为很好用可以为字符串初始化,但是用了之后才发现了一个问题,就是越界,原因是strset是以‘\0’为结束标志的,但是这个字符串本来就没赋值哪里来的'\0',具体的代码为:

#include <iostream>using namespace std;int main(){char *a = "abcd3efghi";char *b = (char *)malloc(15*sizeof(char));strset(b,'q');char *e;e = b;memccpy(b,a,3,5);cout<<a<<endl;cout<<b<<endl;cout<<e<<endl;free(b);b = NULL;getchar();return 0;}

运行结果为:

但是会报错:


所以使用strset时要注意这个问题,不然会发生想不到的错误。

8.void * memset(void *s,int c,size_t n)

将s的前n个字符替换成c。但是没那么智能,memcpy是对字节赋值也就是说如果是对char型数据初始化是没问题的,但是如果对其他类型的话是可以赋值但是输出一下就知道不是你想要的。因为有size_t这个参数所以可以保证他在你想要的地方结束,不会发生上面的问题。

9.char * strrev(char *s)

将字符串全部翻转,返回指针指向翻转后的字符串。

0 0
原创粉丝点击