指针与字符串

开始之前必须明确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



char
c3=(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

当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

char
d1=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];

char
ptr;

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

char
pdest=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

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 下午4:26
下一篇 2023年2月9日 下午4:27

相关推荐