指针与字符串

转载 2011年10月18日 09:31:57

转自:http://www.cnblogs.com/itech/archive/2009/02/22/1395491.html

开始之前必须明确strlen的含义,原型为size_t strlen( char *str ); strlen返回字符串的长度,即null(\0)之前的字符的数量。

一 char* 与 char []

实例加注释:

void TestCharPointerAndArray()
{
   
char *c1= "abc";//abc\0常量区,c1在栈上, 常量区程序结束后自动释放。
   
//c1[1] = 'g';// 常量不能修改
    int i= strlen(c1);// 3

   
char c2[]= "abc";// c2,abc\0都在栈上
    c2[1]= 'g';// 可以修改
    int j= strlen(c2);// 3
    int jj= sizeof(c2);// 4

   
char *c3= (char* )malloc(4* sizeof(char));// c3 栈上
    memcpy(c3,"abc",4);// abc\0 在堆上, 4 = 3(strlen("abc")) + 1('\0');
    c3[1]= 'g';// 可以修改
    int x= strlen(c3);// 3
    free(c3); //如果这里不free,会内存泄漏
    c3 = "abc";// abc\0 在常量区,c3指向了常量区
   
//c3[1] = 'g';// 常量不能修改
    int y= strlen(c3);// 3
}

 

字符串都以\0结尾,所以例如:char *c1= "abc";char c2[] = "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 <string.h> 或<string>或<cstring>
功能:由src所指内存区域复制count个字节到dest所指内存区域。
说明:src和dest所指内存区域不能重叠,函数返回指向dest的指针。

 

    memset

原型:extern void* memset( void* buffer, int ch, size_t count );
包含:#include <string.h> 或<string>或<cstring>
功能:把buffer所指内存区域的前count个字节设置成字符c。
说明:返回指向buffer的指针。

 

 

   memcmp

原型:extern int memcmp(const void *buffer1, const void *buffer2, size_t count );
包含:#include <string.h> 或<string>或<cstring>
功能:比较内存区域buf1和buf2的前count个字节。
说明:
        当buf1<buf2时,返回值<0
        当buf1=buf2时,返回值=0
        当buf1>buf2时,返回值>0



    memchr
原型: extern void *memchr( const void *buffer, int ch, size_t count );
包含:#include <string.h> 或<string>或<cstring>
功能:查找ch在buffer中第一次出现的位置。
说明:如果发现返回指针,如果没有返回NULL。

 

实例:

 

void TestMemFunction()
{
   
char *s1="Hello!";// Hello!\0
    int l= strlen(s1);// 6
    char *d1= new char[l+1];// d1 需要strlen(s1) + 1 空间
    memcpy(d1,s1,l+1);

    memcpy(d1,d1,l);

    memmove(d1
+ 1,d1,l-1);

   
const int ARRAY_LENGTH= 5;
   
char the_array[ARRAY_LENGTH];
   
// zero out the contents of the_array
    memset( the_array, 'c', ARRAY_LENGTH );

   
char *a1= "source1";
   
char arr1[8]= "source2";
   
int r = memcmp(a1,arr1,strlen(a1)- 1);// 仅比较source,所以相等

   
char str[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 ); 分割字符串。

 

实例:

 

void TestStrFunction()
{
    
char string[11];
    
char *str1 = "123456789"// 123456789\0
    strcpy(string, str1);

    strcat(
string,"A"); //123456789A\0

    
int r = strcmp(string,"123456789B"); // 123456789A\0 < 123456789B\0
}

void TestStrFunction2()
{
    
int  ch = 'r';
    
char string[] = "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;
    
char delims[] = "#";
    pdest 
= strtok( string, delims );
    
while( pdest != NULL ) 
    {
        pdest 
= strtok( NULL, delims );
    }
}

 

总结:

1)以mem开始的函数用来bytes的操作,所以需要指定长度,但是以str用来操作以\0结尾的字符串,不需要指定长度。

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!

 

wcscpy_s会改变后面的内容

wchar_t testBuf[MAX_PATH] = {0}; wcscpy_s(testBuf, MAX_PATH, L“c:/test”); assert(testBuf[16] == 0)...
  • chief1985
  • chief1985
  • 2011-05-26 19:20:00
  • 4703

指针_字符串-指针_字符串

  • 2010年10月18日 20:01
  • 273KB
  • 下载

字符指针与字符串

1.字符指针可以指向一个字符串。 我们可以用字符串常量对字符指针进行初始化。例如,有说明语句: char *str = "This is a string."; 是对字符指针进行初始化。此时,字...
  • mensaochun
  • mensaochun
  • 2016-10-11 11:33:57
  • 505

C语言字符串指针(指向字符串的指针)

C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中,这在《C语言字符数组和字符串》中已经进行了详细讲解,这里不妨再来演示一下: #include int main(){ ...
  • u012507643
  • u012507643
  • 2016-10-25 09:09:45
  • 10887

c语言 如何用指针来处理字符串?

一字符指针 1字符指针输出字符串 2字符指针处理字符串 3字符数组与字符指针处理字符串有何不同 二指针数组读者,你好! 如果你精通C,希望能得到你的斧正;如果你是初学者,希望能对你有所帮助。 ...
  • C2681595858
  • C2681595858
  • 2016-12-09 20:48:06
  • 11890

指针遍历字符串—华为机试题

9月5日,华为2014校园招聘的机试题目 通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。 压缩规则:   ...
  • u013147914
  • u013147914
  • 2014-02-25 00:27:02
  • 916

用指针连接字符串

用指针连接字符串/**************************** 功能:用指针连接字符串 日期:2014年12月7日20:39:56 ****************************...
  • Varygod
  • Varygod
  • 2014-12-07 20:54:22
  • 1058

C++指针与字符串

C语言里没有字符串数据类型,要想获得字符串的表示形式利用字符数组 #include using namespace std; #include void main() { char ar[]={'a...
  • cymy001
  • cymy001
  • 2017-11-30 07:03:22
  • 275

指针—字符串复制的方法

这里用了三种方法进行复制 1.地址法://指针练习题: //将字符串a复制到字符串b. 这里使用的是地址法 #include int main() { char a[]=...
  • u012411994
  • u012411994
  • 2014-05-11 14:02:32
  • 1914
收藏助手
不良信息举报
您举报文章:指针与字符串
举报原因:
原因补充:

(最多只允许输入30个字)