无意中发现了一个非常有意思的技术类型小品文系列,通过大牛指导菜鸟的方式,解说讲C++知识,有的非常基础却是开发中easy忽略的地方。

【Elminster的专栏】

http://blog.csdn.net/Elminster/article/contents

【Solmyr 的小品文系列之中的一个:字符串放在哪里? 】

http://blog.csdn.net/elminster/article/details/9730

转帖至此,给出链接,原文就不贴了,总结并扩展一下方便以后回想。

字符数组(char[ ])是元素为字符变量的数组,字符串(char *)是以 '\0' 为结束字符的字符数组。对于字符串来说,是可变长的,所以须要一个字符来标记结束,就是 '/0'。char* 也表示字符指针。

假设用一个字符串字面常量来初始化一个字符数组,得到的数组的长度要比字符串字面常量的长度大1,用来存放'\0'。

	char arr1[] = "Hello";
cout << sizeof(arr1) << endl; //Output: 6

对于字符数组来说,它并不在乎中间或者末尾有没有'\0',由于它知道自己的长度,并且'\0'也是一个合法的元素。可是我们常常会把字符数组当做字符串来用(字符数组作为字符串的缓冲区等),比方使用字符指针来引用一个字符数组,作为參数传给strlen()这种库函数,而strlen却假定你提供的是字符串,即字符指针指向的空间的某个字节放着一个'\0',会造成訪问冲突或者其它不可预知的错误。所以保险起见,在字符数组的末尾放个'\0'。

	char arrChar_1[] = {'a','b','\0','d','e'};
char arrChar_2[] = "Hello";
char *p = "hello";
cout << sizeof(arrChar_1) << endl; //5,数组占5个字节
cout << strlen(arrChar_1) << endl; //2,字符串长度为2
cout << sizeof(arrChar_2) << endl; //6
cout << strlen(arrChar_2) << endl; //5
cout << sizeof(p) << endl; //4,指针占4个字节
cout << strlen(p) << endl; //5,C++默认char* 表示字符串

对字符串的操作要使用strlen, strcpy, strcmp, strcat 这种库函数。

以下这段代码会遇到执行时错误。msg是一个指针,C++不会为它分配内存,它指向字符串常量 "begin" 。字面常量(各种进制的数字、字符、字符串)都仅仅能引用,不能改动,一般被保存在程序的符号表中,而不是在数据区中。当试图去改动仅仅读的字符串时,就会出错。但执行时错误仅仅发生在debug版本号中,在release版本号中能够顺利通过,msg仍然指向"begin",实际上msg的类型能够被觉得是const char*。

	char* msg = "begin";
strcpy(msg, "end");

有的连接器自己主动运行常量合并,str1和str2指向的事实上是同一块内存。有的连接器提供了常量合并的开关。

	char* str1 = "begin";
char* str2 = "begin";

另外,在使用指针之前,应该确保这个指针指向合法的内存,要么指向一块已经存在的内存,要么为它动态分配一块内存。

	char msg[] = "begin"; //为字符数组分配连续的内存
char* pmsg = (char*)malloc(sizeof("end")); //显示动态分配内存
strcpy(pmsg, "end");

C++基础之字符数组和字符串的更多相关文章

  1. C语言基础复习:字符,字符数组,字符串,字符指针

    1. 概述2. 字符2.1 字符定义和大小2.2 字符的输入和输出2.3 字符的计算3. 字符数组3.1 字符数组的定义和大小3.2 字符数组的输入和输出3.3 字符数组的计算4. 字符串4.1 字符 ...

  2. Linux C\C++基础 字符数组、字符串和字符串常量

    1.字符数组和字符串 C语言没有字符串类型,用字符数组模拟 字符串一定是字符数组,字符数组不一定是字符串 如果字符数组以字符'\0'('\0'等同与数字0)结尾,那么这个字符数组就是字符串 char ...

  3. Swift语法基础入门二(数组, 字典, 字符串)

    Swift语法基础入门二(数组, 字典, 字符串) 数组(有序数据的集) *格式 : [] / Int / Array() let 不可变数组 var 可变数组 注意: 不需要改变集合的时候创建不可变 ...

  4. Base-64 字符数组或字符串的长度无效等问题解决方案

    项目特殊需要,调用ActiveX三维控件进行控件某一特殊部位的截图操作,这个截图保存由ActiveX控件控制保存到本地是没问题的,现在需要将这个截图上传到服务器,多人共享,就牵扯到需要读取本地文件…… ...

  5. C语言中字符数组和字符串指针分析

    这几天搞Unix上的C程序,里面用到了很多字符数组和字符串指针,我记得在学完C语言后相当一段时间里,对指针这个东西还是模模糊糊,后来工作也没怎么 用到过C,虽然网上这类的文章也有很多,还是决定自己在这 ...

  6. Base64 报错 的解决办法 (Base-64 字符数组或字符串的长度无效。, 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符。)

    Base64 报错 的解决办法, 报错如下:1. FormatException: The input is not a valid Base-64 string as it contains a n ...

  7. c语言字符数组与字符串的使用详解

    转自:http://www.jb51.net/article/37456.htm 1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ ...

  8. c语言中的字符数组与字符串

    1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ',‘h’,'a','p','p','y ...

  9. C#编程中的Image/Bitmap与base64的转换及 Base-64 字符数组或字符串的长度无效问题 解决

    最近用base64编码传图片遇到了点问题,总结下. 首先总结下base64编码的逻辑,来自网络:https://www.cnblogs.com/zhangchengye/p/5432276.html ...

随机推荐

  1. 百度2019校招Web前端工程师笔试卷(9月14日)

    8月27日晚,在实习公司加班.当时正在调试页面,偶然打开百度首页console,发现彩蛋,于是投了简历. 9月14日晚,七点-九点,在公司笔试. 笔试题型(有出入): 一.单选20道 1.难度不难,考 ...

  2. Javascript和jquery事件-鼠标移入移出事件

    javascript使用mouseover和mouseout,只在css中支持hover jquery支持mouseover和mouseout,封装了mouseenter.mouseleave事件函数 ...

  3. nios博文

    小时不识月:http://www.cnblogs.com/yuphone/archive/2010/09/20/1831448.html cracy bingo:http://www.cnblogs. ...

  4. Java中关于static语句块的理解

    Java中关于static语句块的理解 一.static块会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法. 实例一 public class A{ String name ...

  5. 【Redis】redis的安装、配置执行及Jedisclient的开发使用

    定义: Redis is an open source, BSD licensed, advanced key-value cache and store. It is often referred ...

  6. POJ 2406 Power Strings KMP求周期

    传送门 http://poj.org/problem?id=2406 题目就是求循环了几次. 记得如果每循环输出为1.... #include<cstdio> #include<cs ...

  7. 【Codeforces Round #435 (Div. 2) C】Mahmoud and Ehab and the xor

    [链接]h在这里写链接 [题意] 让你组成一个n个数的集合,使得这n个数的异或和为x; x<=1e5 每个数最大1e6; [题解] 1e5<=2^17<=2^18<=1e6的 ...

  8. swift项目第四天:动态加载控制器

    一:Appdelegate import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate ...

  9. 机器学习算法笔记1_2:分类和逻辑回归(Classification and Logistic regression)

    形式: 採用sigmoid函数: g(z)=11+e−z 其导数为g′(z)=(1−g(z))g(z) 如果: 即: 若有m个样本,则似然函数形式是: 对数形式: 採用梯度上升法求其最大值 求导: 更 ...

  10. php实现 称砝码(背包)

    php实现 称砝码(背包) 一.总结 一句话总结: 1.dp的实质是什么? 刷表啊,用空间换时间 把表画出来会做得更快 13 //动态规划就是一个表 14 //至于这个表的更新就是上面层的表更新下面层 ...