`

[C++对象模型][4]指针与字符串

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

一 char* 与 char []

实例加注释:

Code
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。




实例:



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



实例:



Code
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!

作者:iTech
出处:http://itech.cnblogs.com/
转载:本文版权归作者iTech所有,转载请注明出处,不得用于商业用途!

分享到:
评论

相关推荐

    深入理解C++11:C++11新特性解析与应用

    1966.3.1 并行编程、多线程与C++11 1966.3.2 原子操作与C++11原子类型 1976.3.3 内存模型,顺序一致性与memory_order 2036.4 线程局部存储 2146.5 快速退出:quick_exit与at_quick_exit 2166.6 本章小结 219第7章 为...

    c语言数据结构字符串模式匹配算法.zip

    KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。 一.简单匹配算法 先来看一个简单匹配算法的函数: ...

    C++ Primer第四版【中文高清扫描版】.pdf

    4.3 C风格字符串 113 4.3.1 创建动态数组 117 4.3.2 新旧代码的兼容 120 4.4 多维数组 122 小结 124 术语 125 第5章 表达式 127 5.1 算术操作符 129 5.2 关系操作符和逻辑操作符 131 5.3 位操作符 134 5.3.1 bitset...

    Absolute C++中文版(原书第2版)-完美的C++教程,文档中还包含英文版

    9.3.4 string类对象和C字符串的相互转换 273 第10章 指针和动态数组 280 10.1 指针 280 10.1.1 指针变量 280 10.1.2 内存管理基础 287 10.1.3 动态变量和自动变量 289 10.1.4 指针的应用 292 10.2 动态数组 ...

    c.c++找工作面试重点结构图-mindmanager

    13字符串 13.1字符串字面量 13.2字符串变量 13.3字符串的读写 13.4访问字符串中的字符 13.5C语言的字符库 13.6字符串惯用法 13.7字符串数组 ......... 17指针的高级应用 17.1动态存储分配基础 17.2动态分配...

    Visual C++2010开发权威指南(共三部分).part1.rar

    第一部分 Visual C++ 2010开发与新特性 第1章 Visual C++ 2010开发环境简介 1 1.1 Visual C++ 2010简介 1 1.2 Visual C++ 2010下载安装指南 1 1.3 Visual C++ 2010主要特点与新特性 3 1.4 Visual C++ 2010开发环境...

    77G 22套C语言 C++ 数据结构 程序设计视频课程合集 C丨C++相关学习视频全套视频教程

    MCU_51_指针_数组与字符串指针.mp4 MCU_51_指针与函数参数.mp4 MCU_51_指针变量和指针运算符.mp4 MCU_51_指针数组.mp4 MCU_51_结构.mp4 MCU_51_结构数组_结构与函数.mp4 MCU_51_联合.mp4 PonC_指针和数组-2....

    COM技术内幕——微软组件对象模型--随书源代码

    6.4.3 将字符串转化成GUID 99 6.5 本章小结 101 第7章 类厂 102 7.1 CoCreateInstance 102 7.1.1 CoCreateInstance的声明 103 7.1.2 CoCreateInstance的使用 103 7.1.3 类上下文 104 7.1.4 客户程序清单 105 ...

    Linux C程序设计大全

    第4章 C语言中的指针与字符串 4.1 sizeof运算符 4.1.1 sizeof运算符的应用——得到内置类型的大小 4.1.2 sizeof运算符的应用——得到复合类型的大小 4.2 指针的应用 4.2.1 指针与别名陷阱 4.2.2 数组的指针 4.2.3 ...

    传智播客扫地僧视频讲义源码

    13_字符串一级指针内存模型_传智扫地僧 14_字符串copy函数技术推演 15_字符串copy函数强化训练_判断null_引入辅助指针变量_传智扫地僧 16_项目开发模型强化_strstr_while模型_重要 17_作业考试强化 源码及文档 01_上...

    程序设计教程 陈家骏等编著

    10.4 字符串I/O 327 10.5 小结 328 10.6 习题 329 第11章 异常处理 330 11.1 异常的概念 330 11.2 C++异常处理机制 331 11.2.1 try、throw以及catch语句 331 11.2.2 异常处理的嵌套 334 11.3 小结 335 11.4 习题 336...

    McGraw C++程序调试实用手册

    13.1.7 STL字符串指针的麻烦 13.1.8 释放 STL指针 13.2 一个C++程序转变为STL语法的例子 13.2.l 第一步――更新aSingleCard类 13.2.2 第二步――更新 WarDeck类 13.2.3 第三步――修复STL代码的执行...

    C/C++笔试题(附答案,华为面试题系列)

    (1)不调用C++/C 的字符串库函数,请编写函数 strcat 答: VC源码: char * __cdecl strcat (char * dst, const char * src) { char * cp = dst; while( *cp ) cp++; /* find end of dst */ while( *cp++ = *src++ ...

    编程新手真言......

    4.2 C的数组,指针与字符串 84 4.3 C的输入与输出流 84 4.4 C的类型系统与表达式 85 4.5 二进制指令看循环 85 4.6 所谓指针:当指针用于设计居多时 86 4.7 指针成就的C语言 86 4.8 指针是语言的一种抽象机制 88 4.9 ...

    一线大厂百度面试题.zip

    3.1.0 在函数内定义一个字符数组, 用 gets 函数输入字符串的时候, 如果输入越界, 为什么 程序会崩溃? 3.1.1 C++中引用与指针的区别 3.1.2 C/C++程序的内存分区 3.1.3 快速排序的思想、时间复杂度、实现以及优化...

    深入解析ATL(第2版).pdf

    全书内容丰富,深入浅出,主要涵盖了ATL内部架构和实现方法、运用向导简化ATL开发、C++/COM/ATL中字符串的使用技巧、理解并正确实现IUnknown、充分利用ATL提供的Smart Types、撰写能够暴露COM服务器上COM对象的粘合...

    The Art of Assembly Language

    第14章 类与对象 14.1 本章概述 14.2 通用原则 14.3 HLA中的类 14.4 对象 14.5 继承 14.6 重载 14.7 虚拟方法与静态过程 14.8 编写类方法和过程 14.9 对象实现 14.10 构造函数和对象初始化 14.11 析构函数 14.12 HLA...

    Linux多线程服务端编程:使用muduo C++网络库

    《Linux多线程服务端编程:使用muduo C++网络库》主要讲述采用现代C++在x86-64 Linux上编写多线程TCP网络服务程序的主流常规技术,重点讲解一种适应性较强的多线程服务器的编程模型,即one loop per thread。...

    C#微软培训资料

    9.2 对象的模型技术 .103 9.3 面向对象的分析 .105 9.4 面向对象的设计 .107 9.5 小 结 .110 第十章 类 .112 10.1 类 的 声 明 .112 10.2 类 的 成 员 .113 10.3 构造函数和析构函数 .119 10.4 小 ...

Global site tag (gtag.js) - Google Analytics