开始之前必须明确strlen的含义,原型为size_t strlen( char *str ); strlen返回字符串的长度,即null( )之前的字符的数量。
一 char* 与 char []
实例加注释:
Code
voidTestCharPointerAndArray()
{
charc1="abc";//abc 常量区,c1在栈上, 常量区程序结束后自动释放。
//c1[1] = 'g';//常量不能修改
inti=strlen(c1);//3
charc2[]="abc";//c2,abc 都在栈上
c2[1]='g';//可以修改
intj=strlen(c2);//3
intjj=sizeof(c2);//4
charc3=(char)malloc(4sizeof(char));//c3 栈上
memcpy(c3,"abc",4);//abc 在堆上, 4 = 3(strlen("abc")) + 1(' ');
c3[1]='g';//可以修改
intx=strlen(c3);//3
free(c3);//如果这里不free,会内存泄漏
c3="abc";//abc 在常量区,c3指向了常量区
//c3[1] = 'g';//常量不能修改
inty=strlen(c3);//3
}
字符串都以 结尾,所以例如:char*c1="abc";charc2[]="abc";,使用strlen得到长度都为3,但是实际的存储空间为strlen+1即3+1。
二 C中字符串操作函数
C++的程序员对C中的字符串指针操作的函数却并不是相当的熟悉。而C中的这些字符串的指针操作函数有的时候也是必须要面对的,比如我们的库要提供C函数接口,保持向后兼容和跨平台,还有我们经常使用一些第三方的库中都或多或少的使用到了这些C中的指针操作函数,所以下面列出C的指针操作函数,帮助大家熟悉之。
1) memcpy/memset/memcmp
memcpy | 原型:extern void *memcpy( void *to, const void *from, size_t count ); 包含:#include 功能:由src所指内存区域复制count个字节到dest所指内存区域。 说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。 |
memset | 原型:extern void* memset( void* buffer, int ch, size_t count ); 包含:#include 功能:把buffer所指内存区域的前count个字节设置成字符c。 说明:返回指向buffer的指针。 |
memcmp | 原型:extern int memcmp(const void *buffer1, const void *buffer2, size_t count ); 包含:#include 功能:比较内存区域buf1和buf2的前count个字节。 说明: 当buf1 当buf1>buf2时,返回值>0 |
memchr | 原型: extern void *memchr( const void *buffer, int ch, size_t count ); 包含:#include 功能:查找ch在buffer中第一次出现的位置。 说明:如果发现返回指针,如果没有返回NULL。 |
实例:
Code
voidTestMemFunction()
{
chars1="Hello!";//Hello!
intl=strlen(s1);//6
chard1=newchar[l+1];//d1 需要strlen(s1) + 1 空间
memcpy(d1,s1,l+1);
memcpy(d1,d1,l);
memmove(d1+1,d1,l-1);
constintARRAY_LENGTH=5;
charthe_array[ARRAY_LENGTH];
//zero out the contents of the_array
memset( the_array,'c', ARRAY_LENGTH );
chara1="source1";
chararr1[8]="source2";
intr=memcmp(a1,arr1,strlen(a1)-1);//仅比较source,所以相等
charstr[17];
charptr;
strcpy(str,"This is a string");
ptr=(char*)memchr(str,'r', strlen(str));
}
2) strlen/strcpy/strcat/strcmp/strchr/strcoll/strstr/strtok/strtod/strtol
strcpy | char *strcpy(char *s1, const char *s2) 将字符串s2复制到字符串数组s1中,返回s1的值 |
strcat |
char *strcat(char *s1, const char *s2) 将字符串s2添加到字符串s1的后面。s2的第一个字符重定义s1的null终止符。返回s1的值 |
strcmp |
int strcmp(const char *s1, const char *s2) 比较字符串s1和字符串s2。函数在s1等于、小于或大于s2时分别返回0、小于0或者大于0的值 |
strchr | char *strchr(char * str,int c ); 在str中查找c第一次出现的位置。 |
strstr | char *strstr(char *str,const char *strSearch );在string1中查找string2第一次出现的位置。 |
strtok | char *strtok(char *strToken,const char *strDelimit ); 分割字符串。 |
实例:
Code
voidTestStrFunction()
{
charstring[11];
charstr1="123456789";//123456789
strcpy(string, str1);
strcat(string,"A");//123456789A
intr=strcmp(string,"123456789B");//123456789A < 123456789B
}
voidTestStrFunction2()
{
intch='r';
charstring[]="The quick # brown dog # jumps over # the lazy fox";
charpdest=NULL;
pdest=strchr(string, ch );
pdest=NULL;
char*str="dog";
pdest=strstr(string,str);
pdest=NULL;
chardelims[]="#";
pdest=strtok(string, delims );
while( pdest!=NULL )
{
pdest=strtok( NULL, delims );
}
}
总结:
1)以mem开始的函数用来bytes的操作,所以需要指定长度,但是以str用来操作以 结尾的字符串,不需要指定长度。
2)对于unicode,相应的字符串操作函数前缀为wcs,例如wcscpy,wcscat,wcscmp,wcschr,wcsstr,wcstok等。
3)在vc中还提供了有安全检测的字符串函数后缀_s,例如strcpy_s,strcat_s,strcmp_s,wcscpy_s,wcscat_s,wcscmp_s等。
4)char如果指向常量区,不能被修改,且此char不需要delete。例如 char* pStr = "ABC";。
三 std::string和std::wstring使用相当简单哦!
四 完!
感谢,Thanks!
原文链接: https://www.cnblogs.com/cy568searchx/archive/2013/01/04/2844386.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/74506
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!