`
7090
  • 浏览: 273395 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

c++ 字符串的一些概念

 
阅读更多
今天看到《c++ primer》上关于字符串的介绍,才惊讶的发现自己之前的很多观念是错误的,现有项目的一些细节也忽略了

1:释放数组指针记得是使用  delete [] pia,虽然早就知道这一点,但是在项目中有时候还是忘记数组指针的释放方法,很轻易的就使用 delete pia进行指针的释放,造成内存泄露了,对于多维数组pia[][],或者类似形式的int** pia = new int[rows][cols],要进行如下形式的资源释放
for (int i = 0 ;i < rows;i++)
{
    delete [] pia[i];
}
delete [] pia;

对于 int *p = new  int[num],这种指针一定要清醒的认识到这是数组指针,所以要使用delete []p;进行删除。
同样的像这样的指针
int  a =3;
int *p =&a;
delete p;

这样的指针p就不能也不用删除了
另外指针删除要注意的几点是:不能重复删除同一个指针,删除指针时,指针要指向最初创建的指针的地址,对于这点可以参考这篇文章:http://www.cnblogs.com/JCSU/articles/1051729.html

2:c++中c语言风格的字符串都是以'\0'标志结束的,你创建下面一个数组也是可以的
char c[] = {'c','+','+'};

虽然创建时可以的,但是当调用标准库函数时就会引发无法预知的错误,比如调用strlen(c), c是一个没有null结束的字符串,所以当调用该函数时,系统会从c指向的内存地址开始搜索,直到遇到字符null为止,很明显这是错误的。
同样的使用strcmp,strcat,strncat,strcpy,strncpy也会引发错误。
对于strcpy跟strncpy还有几点要另外注意。strcpy(s1,s2)是将s2复制到s1,要求s1的占用的空间要大于等于s2,同时要保证结束符'\0'的复制。因此如果我们使用strlen获取s2字符长度n用于创建s1时,一定要使得n+1,因为strlen获取的s的长度,并不包括'\0',而s1是要以'\0'结尾的,像下面的最做法才是正确的
const char *from ="abcde";
int len = strlen(from);
char *to = new char[len + 1];
strcpy(to ,from); 
//或者是     strncpy(to ,from ,len+1);

如果创建的to数组的大小,小于或者等于len,肯定是错误的,因为from剩下的字符就覆盖到了to数组外的地址去了,可能造成不可预知的错误。值得注意的一点是即使是使用strncpy当s1的长度等于len时,实现结果跟使用strcpy创建len长度的数组是一样的, 虽然表面上s1达到的预期的效果,但是复制过程中from数组的结束符'\0',还是复制到了to以下的空间,造成了内存操作的混乱。

3:关于动态分配的数组的初始化,如果数组元素是类类型,比如string(曾经混淆string是否是类类型),将调用该类的默认构造方法进行初始化,如果元素是基本数据类型,也就是内置类型,则无初始化。
string *s = new string[10];  //调用默认构造方法进行初始化。默认为""
int *i = new int[10];        //没有初始化

另外可以
 int *i = new int[10]();
可以这样使用圆括号进行初始化,该例子被元素初始化为0.
对于const对象的动态数组,数组元素同样也是内置类型的话,就必须使用圆括号进行初始化了。
const  int *i = new cosnt int[10]();

类类型可以不加圆括号,因为他们会默认调用构造方法进行初始化了。
分享到:
评论

相关推荐

    C++字符串完全指引

    本文摘自VC知识库 原著:Michael Dunn 翻译:Chengjie Sun 对C++字符串非常详尽的解释,我看完后对以前比较模糊的多字符集、宽字节等概念有种豁然开朗的感觉。特地分享给大家。

    C++ 中String 替换指定字符串的实例详解

    首先明白一个概念,即string替换所有字符串,将”12212″这个字符串的所有”12″都替换成”21″,结果是什么? 可以是22211,也可以是21221,有时候应用的场景不同,就会希望得到不同的结果,所以这两种答案都做了...

    C和C++ 字符串字面量的比较

    了解这些内容对于加深字符串字面量以及相关一些概念的理解、澄清一些常见的概念误区不无助益。本文以普通字符串字面量 "hello" 为例总结说明如下。 如果你发现了本文中的错误,或者对本文有什么感想或建议,可通过 ...

    EDA/PLD中的C和C++ 字符串字面量的比较

    了解这些内容对于加深字符串字面量以及相关一些概念的理解、澄清一些常见的概念误区不无助益。本文以普通字符串字面量 "hello" 为例总结说明如下。 如果你发现了本文中的错误,或者对本文有什么感想或建议,可通过 ...

    第6章 数组 指针与字符串(郑莉 C++语言程序设计(第4版))

    本书针对程序设计的初学者,以面向对象的程序设计思想为主线,以通俗易懂的方法介绍C++语言,引导读者以最自然的方式,将人类习惯的面向对象的思维方法运用到程序设计中。主要内容包括程序设计基础知识、类与对象的...

    解读C++11 原生字符串

    C++作为一门高级程序设计语言,自然不能自甘落后,从C++11开始,C++也开始支持原生字符串。 很多时候,当我们需要一行字符串的时候,字符串转义往往成了一个负担,写和读都带了很大的不便。例如,对于如下路径”D:\...

    C编程之字符串与指针教程

    ● 数组及其使用方法 ● 如何声明和初始化不同类型的数组 ● 如何声明和使用多维数组 ● 指针及其使用方法 ... ● 如何在C++/CLI 程序中处理字符串和数组 ● 内部指针的概念,创建和使用内部指针的方法

    C++解析xml文档或者xml字符串方法

    通过研究发现通过xml形式的字符串返回是一种解决方案,在解决这样的返回值的同时突然发现其实如果输入参数是结构体的话,也可以通过xml字符串的形式传入。然而怎么去解析它呢,而又怎么去做一个xml字符串呢,通过...

    C++中string替换所有指定字符串的方法

    C++的string提供了replace方法来实现字符串的替换,但是对于将字符串中某个字符串全部替换这个功能,string并没有实现,我们今天来做的就是这件事。 首先明白一个概念,即string替换所有字符串,将”12212″这个字符...

    c语言基础之字符串+转义字符

    字符串的基本概念 “hello,world!” 像这种由双引号引起来的一串字符称为字符串字面值,简称字符串。 'a' C语言中用单引号引起来的叫做字符 a 用双引号括起来的叫做字符串 注意: C语言是不提供字符串类型的 ,...

    深入理解类之1使用类2字符串的库类.ppt

    1使用类:理解背景,掌握原理和思路,融汇贯通 ...标准库中通过string类支持字符串的概念;string类支持字符串和数字的相互转换;string类的应用使得问题的求解变得简单;string类最大限度的兼容了C字符串的用法

    头歌数据结构数据结构—字符串

    后来随着计算机的发展,非数值型数据的处理工作越来越多,于是有了字符串的概念。例如,在搜索引擎中输入“数据结构”,在浏览器中会出现与“数据结构”相关的关键词,这就是字符串匹配操作。 通过本实践项目的训练...

    C++98、C++03、C++11、C++14、C++17、C++20的CHM查询文档

    字符串库 容器库 迭代器库 范围库 (C++20) 算法库 数值库 输入/输出库 文件系统库 本地化库 正则表达式库 原子操作库 线程支持库 实验性 C++ 特性 有用的资源 索引 std 符号索引 协程支持 (C++20) C++ 关键词

    c++参考手册 2018版

    字符串转换 (C++17) 工具函数 pair − tuple (C++11) optional (C++17) − any (C++17) variant (C++17) 字符串库 basic_string basic_string_view (C++17) 空终止字符串: 字节 − 多字节 − 宽 容器库 ...

    time_t 与字符串之间的相互转换

    转本文介绍了标准C/C++中的有关日期和时间的概念,并通过各种实例讲述了这些函数和数据结构的使用方法。笔者认为,和时间相关的一些概念是相当重要的,理解这些概念是理解各种时间格式的转换的基础,更是应用这些...

    云南大学C++实验.rar

    云南大学软件学院C++实验 实验一 类和对象的特性 ...回文字符串就是从前向后看与从后向前看都是一样的字符串,例如“SoS”,但 “hi”就不是回文字符串。请编写算法,检查检查输入字符串是否是回文字符串。

    c++课程设计题目

    运用C++语言描述数据类、字符串类,每一个类应包含数据成员和成员函数。设计基类和派生类,并运用多态性和虚函数的知识。注重面向对象程序设计理论知识的理解与实际的动手编程能力,要求学生设计具有继承与派生以及...

    [C++算法入门]-两串旋转练习题

    文档中包含了一系列的练习题,涵盖了字符串旋转的基本概念、实现方法和应用场景。通过完成这些练习,读者将能够加深对字符串旋转的理解,并掌握使用C++编程语言解决相关问题的技巧。 此外,文档还提供了详细的答案...

    Visual C++应用教程-程序代码

    “习题”部分除第2、第3章突出C++的基础内容外,其余各章的习题主要是弄清一些基本概念。“上机操作指导”通过实例先引导操作和编程,然后提出问题思考和在原来基础上读者自己进行操作和编程练习。

    第6章 数组 指针与字符串O(郑莉 C++语言程序设计(第4版))

    本书针对程序设计的初学者,以面向对象的程序设计思想为主线,以通俗易懂的方法介绍C++语言,引导读者以最自然的方式,将人类习惯的面向对象的思维方法运用到程序设计中。主要内容包括程序设计基础知识、类与对象的...

Global site tag (gtag.js) - Google Analytics