1.strcat
原型:extern char *strcat(char *dest,char *src); 用法:#include <string.h> 功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。 举例: // strcat.c #include <syslib.h> #include <string.h> main() { char d[20]="Golden Global"; char *s=" View"; clrscr(); strcat(d,s); printf("%s",d); getchar(); return 0; } 程序执行结果为: Golden Global View
char* strcat(char* dst, cosnt char* src); // 需要保证dst的大小足至少是strlen(dst) + strlen(src) + 1,否则数组溢出。
2.strncat
原型:extern char *strncat(char *dest,char *src,int n); 用法:#include <string.h> 功能:把src所指字符串的前n个字符添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。 举例: // strncat.c #include <syslib.h> #include <string.h> main() { char d[20]="Golden Global"; char *s=" View WinIDE Library"; clrscr(); strncat(d,s,5); printf("%s",d); getchar(); return 0; }
3.strlen
strlen 原型:extern int strlen(char *s); 用法:#include <string.h> 功能:计算字符串s的(unsigned int型)长度 说明:返回s的长度,不包括结束符NULL。
4. strcmp
原型:extern int strcmp(char *s1,char * s2); 用法:#include <string.h> 功能:比较字符串s1和s2。 说明: 当s1<s2时,返回值<0 当s1=s2时,返回值=0 当s1>s2时,返回值>0 即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止。如: "A"<"B" "a">"A" "computer">"compare" 举例: // strcmp.c #include <syslib.h> #include <string.h> int main() { char *s1="Hello, Programmers!"; char *s2="Hello, programmers!"; int r; clrscr(); r=strcmp(s1,s2); if(!r) printf("s1 and s2 are identical"); else if(r<0) printf("s1 less than s2"); else printf("s1 greater than s2"); getchar(); return 0;
5. sizeof是编译器针对变量分配的内存大小 6. strlen是字符串的长度
7.strlwr
原型:extern char *strlwr(char *s); 用法:#include <string.h> 功能:将字符串s转换为小写形式 说明:只转换s中出现的大写字母,不改变其它字符。返回指向s的指针。 举例: // strlwr.c #include <syslib.h> #include <string.h> main() { char *s="Copywrite 1999-2000 GGV Technologies"; clrscr(); printf("%s",strlwr(s)); getchar(); return 0; }
}
8.strcpy
原型:extern char *strcpy(char *dest,char *src); 用法:#include <string.h> 功能:把src所指由NULL结束的字符串复制到dest所指的数组中。 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。 返回指向dest的指针。 给一个很经典版本的strcpy函数源码: char *strcpy(char *strDest, const char *strSrc); { assert((strDest!=NULL) && (strSrc !=NULL)); char *address = strDest; while( (*strDest++ = * strSrc++) != ‘\0’ ) NULL ; return address ; }
9.strncpy
char * strncpy(char *s1,char *s2,size_t n); 将字符串s2中最多n个字符复制到字符数组s1中,返回指向s1的指针。 注意:如果源串长度大于n,则strncpy不复制最后的'\0'结束符,所以是不安全的,复制完后需要手动添加字符串的结束符才行。 Strcpy和Strncpy的区别- - 第一种情况: char* p="how are you ?"; char name[20]="ABCDEFGHIJKLMNOPQRS"; strcpy(name,p); //name改变为"how are you ? "====>正确! strncpy(name,p,sizeof(name)); //name改变为"how are you ? " ====>正确! 第二种情况: char* p="how are you ?"; char name[10]; strcpy(name,p); //目标串长度小于源串,错误! name[sizeof(name)-1]='\0'; //和上一步组合,弥补结果,但是这种做法并不可取,因为上一步出错处理方式并不确定 strncpy(name,p,sizeof(name)); //源串长度大于指定拷贝的长度sizeof(name),注意在这种情况下不会自动在目标串后面加'\0' name[sizeof(name)-1]='\0'; //和上一步组合,弥补结果 ================================================ 总结:strcpy 源字串全部拷贝到目标字串中,包括'\0',但是程序员必须保证目标串长度足够,且不与源串重叠。 strncpy 如果目标长>=指定长>源长,则将源串全部拷贝到目标串,连同'\0' 如果指定长<源长,则将截取源串中按指定长度拷贝到目标字符串,不包括'\0' 如果指定长>目标长,错误!
10.memcpy
原型:extern void *memcpy(void *dest, void *src, unsigned int count); 用法:#include <string.h> 功能:由src所指内存区域复制count个字节到dest所指内存区域。 说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。 举例: // memcpy.c #include <stdio.h> #include <string.h> int main(int argc, char* argv[]) { char *s="Golden Global View"; char d[20]; clrscr(); memcpy(d,s,strlen(s)); d[strlen(s)]='\0'; printf("%s",d); getchar(); return 0; } 截取view #include <string.h> int main(int argc, char* argv[]) { char *s="Golden Global View"; char d[20]; memcpy(d,s+14,4); //memcpy(d,s+14*sizeof(char),4*sizeof(char));也可 d[4]='\0'; printf("%s",d); getchar(); return 0; } 输出结果: View 初始化数组 char msg[10]; memcpy(msg,0,sizeof(msg));
11.memset 功 能: 将s所指向的某一块内存中的每个字节的内容全部设置为ch指定的ASCII值, 块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作 用 法: void memset(void *s, char ch, unsigned n); 程序例: #include <string.h> #include <stdio.h> #include <memory.h> int main(void) { char buffer[] = "Hello world\n"; printf("Buffer before memset: %s\n", buffer); memset(buffer, '*', strlen(buffer) ); printf("Buffer after memset: %s\n", buffer); return 0; } 输出结果: Buffer before memset: Hello world Buffer after memset: *********** 编译平台: Microsoft Visual C++ 6.0 也不一定就是把内容全部设置为ch指定的ASCII值,而且该处的ch可为int或者其他类型,并不一定要是char类型。例如下面这样: int array[5] = {1,4,3,5,2}; for(int i = 0; i < 5; i++) cout<<array[i]<<" "; cout<<endl; memset(array,0,5*sizeof(int)); for(int k = 0; k < 5; k++) cout<<array[k]<<" "; cout<<endl; 输出的结果就是: 1 4 3 5 2 0 0 0 0 0 后面的表大小的参数是以字节为单位,所以,对于int或其他的就并不是都乘默认的1(字符型)了。而且不同的机器上int的大小也可能不同,所以最好用sizeof()。 要注意的是,memset是对字节进行操作,所以上述程序如果改为 int array[5] = {1,4,3,5,2}; for(int i = 0; i < 5; i++) cout<<array[i]<<" "; cout<<endl; memset(array,1,5*sizeof(int));// 注意 这里与上面的程序不同 for(int k = 0; k < 5; k++) cout<<array[k]<<" "; cout<<endl; 输出的结果就是: 1 4 3 5 2 16843009 16843009 16843009 16843009 16843009 为什么呢? 因为memset是以字节为单位就是对array指向的内存的5个字节进行赋值,每个都用ASCII为1的字符去填充,转为二进制后,1就是00000001,占一个字节。一个INT元素是4字节,合一起就是00000001000000010000000100000001,就等于16843009,就完成了对一个INT元素的赋值了。 所以用memset对非字符型数组赋初值是不可取的! 例如有一个结构体Some x,可以这样清零: memset( &x, 0, sizeof(Some) ); 如果是一个结构体的数组Some x[10],可以这样: menset( x, 0, sizeof(Some)*10 ); [编辑本段]memset函数详细说明 1。void *memset(void *s,int c,size_t n) 总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。 2。例子 main(){ char *s="Golden Global View"; clrscr(); memset(s,'G',6);//貌似这里有点问题// printf("%s",s); getchar(); return 0; } 【这个问题相当大,程序根本就运行不下去了,你这里的S志向的是一段只读的内存,而你memset又试图修改它,所以运行时要出错,修改办法char *s修改为char s[]】 3。memset() 函数常用于内存空间初始化。如: char str[100]; memset(str,0,100); 4。memset()的深刻内涵:用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘memset(a, '\0', sizeof(a)); memcpy用来做内存拷贝,你可以拿它拷贝任何数据类型的对象,可以指定拷贝的数据长度;例: char a[100], b[50]; memcpy(b, a, sizeof(b)); //注意如用sizeof(a),会造成b的内存地址溢出。 strcpy就只能拷贝字符串了,它遇到'\0'就结束拷贝;例: char a[100], b[50]; strcpy(a,b); 如用strcpy(b,a),要注意a中的字符串长度(第一个‘\0’之前)是否超过50位,如超过,则会造成b的内存地址溢出。 5.补充:某人的一点心得 memset可以方便的清空一个结构类型的变量或数组。 如: struct sample_struct { char csName[16]; int iSeq; int iType; }; 对于变量 struct sample_strcut stTest; 一般情况下,清空stTest的方法: stTest.csName[0]='\0'; stTest.iSeq=0; stTest.iType=0; 用memset就非常方便: memset(&stTest,0,sizeof(struct sample_struct)); 如果是数组: struct sample_struct TEST[10]; 则 memset(TEST,0,sizeof(struct sample_struct)*10); 或 memset(TEST,0,sizeof(TEST));