string中各函数的用法


strcat memset strcpy strncat等等的总结

 

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));

 

原文地址:https://www.cnblogs.com/zhanglanyun/p/2331050.html