无意中发现了一个非常有意思的技术类型小品文系列,通过大牛指导菜鸟的方式,解说讲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. 编程一一C语言问题,指针函数与函数指针

    资料来源于网上: 一.指针函数:指返回值是指针的函数      类型标识符    *函数名(参数表)       int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个地址值.函数返 ...

  2. js课程 4-12 js中正则表达式如何使用

    js课程 4-12 js中正则表达式如何使用 一.总结 一句话总结: 1.js正则表达式手册取哪里找? w3cschool或者菜鸟教程->找到js正则表达式->完整的RegExp参考手册这 ...

  3. 《机器学习实战》---第二章 k近邻算法 kNN

    下面的代码是在python3中运行, # -*- coding: utf-8 -*- """ Created on Tue Jul 3 17:29:27 2018 @au ...

  4. 【习题 5-8 UVA - 230】Borrowers

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用map+set写个模拟就好. 3个区域 书架.桌子.别人的手上. 其中前两个区域的书都能借出去. [代码] #include &l ...

  5. 【BZOJ 1096】[ZJOI2007]仓库建设

    [链接] 链接 [题意] 在这里输入题意 [题解] 设f[i]表示在第i个地方设立一个仓库,且前面符合要求的最小花费. 则 \(f[i] = min(f[j] + c[i] + dis[i]*(sum ...

  6. hadoop配置文件的加载机制 分类: A1_HADOOP 2015-01-21 11:29 839人阅读 评论(0) 收藏

    hadoop通过Configuration类来保存配置信息 1.通过Configuration.addResource()来加载配置文件 2.通过Configuration.get***()来获取配置 ...

  7. Swift 语言概览 -自己在Xcode6 动手写2-tableView

    import UIKit class ViewController: UIViewController ,UITableViewDelegate, UITableViewDataSource { va ...

  8. 【2006】求N!的精确值

    Time Limit: 3 second Memory Limit: 2 MB 对于阶乘函数,即使自变量较小,其函数值也会相当大.例如: 10!=3628800 25!=155112100433309 ...

  9. WordPress通过插件发送邮件

    原文发表自我的个人站点,欢迎大家訪问~转载请保留本段,或注明原文链接:http://www.hainter.com/wordpress-send-email-via-plugins WordPress ...

  10. COCOS2D-X 3.0在MAC下创建新IOS项目:

    首先进入:CocoStudio\Source\3.0\cocos2d-x\tools\cocos2d-console\bin 运行 ./cocos new -p com.aaaa -l cpp MyG ...