c风格字符串,字符串字面值,c++字符串
C风格字符串:本质上就是以空字符null为结束符的数组
可以简单的理解为:有'\0'的是c风格字符串,无'\0'的是普通字符数组
字符串字面值:是一串常量字符,字符串字面值常量用双引号括起来的零个或多个字符表示。
C++字符串:通俗而言是string类,为和c语言兼容,C++中所有的字符串字面值都由编译器自动在末尾添加一个空字符。(实际上在c++中,string最好直接理解为一个基本类型,相关操作都封装在string类中,避免使用char *出错)
由下面的代码可以看出:
int main()
{
char str1[] = {'H','e','l','l',''};
char str2[] = {'H','e','l','l',''};
//char str3[5] = "Hello"; //error
char str4[] = "Hello";
cout << sizeof(str1) << endl; //
cout << sizeof(str2) << endl; //
cout << strlen(str1) << endl; //
cout << strlen(str2) << endl; //
cout << strlen(str4) << endl; //
cout << str1 << endl; //Hell0烫烫烫潭9媭?
cout << str2 << endl; //Hell0
cout << str4 << endl; //Hell0
char str5[] = {'H','e','l','l',''};
char str6[] = {'H','e','l','l',''};
cout << sizeof(str5) << endl; //
cout << sizeof(str6) << endl; //
cout << str5 << endl; //Hell0
cout << str6 << endl; //Hell0烫烫烫潭9媭?
char str7[] = "Hello";
char str8[] = "Hello";
cout << sizeof(str7) << endl; //
cout << sizeof(str8) << endl; //
cout << strlen(str8) << endl; //
string str9 = "Hello";
cout << str9.size() << endl; //
}
写成“Hello”形式时,都必须给'\0'预留空间(必须有),要不然会直接报错,其sizeof大小为6,但是其strlen为5(说明这种形式的时候会自动加一个'\0',sizeof是求变量占用空间,因此带上'\0'大小,strlen是只计算有效字符个数,null之前字符个数)
如果char *数组大小和字符个数相等时(或者未显示分配大小):分开来写成{'H','e','l','l','0'}形式时,其数组大小可以直接和字符个数相等,其sizeof就是字符个数,不会自动补齐‘\0’,但是打印或者处理的时候,因为找不到结束符,因此会处理到其他内存的内容,有很大的隐患。
如果char *数组大小大于字符个数,则也会补一个‘\0’
因此以char *形式处理字符串的时候一定要注意结束符以及是否溢出,如果空间预留过大又浪费空间
而且修改或者特殊查询的时候还得创建副本
而string则不需要注意这些,空间对象如何分配,是否要创建副本由类内部处理,用户可以当作普通变量处理,而且string作为c++标准库,有很多方法都有现成的,直接在API上就可以查询到,方便快捷
c风格字符串,字符串字面值,c++字符串的更多相关文章
- C#给字符串赋予字面值——字符串插入、转义序列的使用
1.占位符.字符串插入 给字符串赋予字面值时,经常遇见在字符串中包含变量的情况,用连接符进行拼接.转换的方式比较麻烦.还容易出错.C#提供了较为便捷的处理方式,即‘占位符’,以及C#6的新功能‘插入字 ...
- C#中字符串的字面值(转义序列)
在程序开发中,经常会碰到在字符串中字面值中使用转义序列,下面表格收集了下转义序列的完整列表,以便大家查看引用: 转义序列列表 转义序列 产生的字符 字符的Unicode值 \' 单引号 0x0027 ...
- 016 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 10 布尔类型和字符串的字面值
016 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 10 布尔类型和字符串的字面值 本文知识点:字面值 关于字面值的概念,需要注意:很多地方,我们可能就把字面值 ...
- Swift3.0语言教程使用字符串创建和初始化字符串
Swift3.0语言教程使用字符串创建和初始化字符串 Swift3.0语言教程使用字符串创建和初始化字符串,在编程语言中,字面值是很常见的数据描述形式.人们可以通过字面所表达的意思,获知其含义,尤其是 ...
- 区分/不区分大小写的比较,查找字符串在另一字符串中的位置,字符串开头是否包括另一字符串 hasPrefix
NSString *str; // 使用stringWithFormat生成一格式化字符串 str = [NSString stringWithFormat:@"This is %@&quo ...
- python字符串、字符串处理函数及字符串相关操作
python字符串.字符串处理函数及字符串相关操作 字符串介绍 python字符串表示 Python除处理数字外还可以处理字符串,字符串用单撇号或双撇号包裹: >>> 'spam e ...
- C/C++判断字符串是否包含某个字符串
C风格 #include <iostream> #include <string> #include <cstring> using namespace std; ...
- JS字符串替换函数:Replace(“字符串1″, “字符串2″),
JS字符串替换函数:Replace(“字符串1″, “字符串2″), 1.我们都知道JS中字符串替换函数是Replace(“字符串1″, “字符串2″),但是这个函数只能将第一次出现的字符串1替换掉, ...
- C#算法之判断一个字符串是否是对称字符串
记得曾经一次面试时,面试官给我电脑,让我现场写个算法,判断一个字符串是不是对称字符串.我当时用了几分钟写了一个很简单的代码. 这里说的对称字符串是指字符串的左边和右边字符顺序相反,如"abb ...
- 将数据转化成字符串时:用字符串的链接 还是 StringBuilder
/* 目的:将数据转化成字符串时:用字符串的链接 还是 StringBuilder呢? */ public class Test{ public static void main(String[] a ...
随机推荐
- python 日期格式化常用标记
符号 说明 例子 %a 英文星期的简写 Mon %A 英文星期的完整编写 Monday %b 英文月份的简写 Jun %B 英文月份的完整编写 June ...
- YII 1.0 隐藏单入口index.php 设置路由与伪静态
隐藏 index.php 保证apache配置文件httpd.conf里的LoadModulerewrite_module modules/mod_rewrite.so开启(去掉#)将相对应目录的Al ...
- CentOS-6.6下Tomcat-7.0安装与配置(Linux)
CentOS-6.6下Tomcat-7.0安装与配置(Linux) 一.认识tomcat Tomcat是一个免费的开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个核心项目, ...
- js原生设计模式——2面向对象编程之闭包1
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- Intent的属性及Intent-filter配置——指定Action、Category调用系统Activity
Intent代表了启动某个程序组件的“意图”,实际上Intent对象不仅可以启动本应用内程序组件,也可启动Android系统的其他应用的程序组件,包括系统自带的程序组件——只要权限允许. 实际上And ...
- HDU-2573-Typing
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2573 这题把%s与gets()的输入法搞混了一直感觉没有错,就是找不出哪里错了, 题目思路不是很难. ...
- iReport默认参数和变量的含义解析【转】
iReport默认参数和变量的含义解析[转] http://uule.iteye.com/blog/775338 参考:http://blog.csdn.net/terryzero/article/d ...
- javascript object-oriented something
http://www.ibm.com/developerworks/cn/web/1304_zengyz_jsoo/ http://www.cnblogs.com/RicCC/archive/2008 ...
- Js中Array数组学习总结
第一次写博客...有点方... 小白一枚(是真的小白),自学前端,下面来说说我在学习过程中总结的一些数组操作,如果说哪有错误,请各位大神多多指出,小的虚心接受. 引用类型分为Object类型(所谓的对 ...
- HDU5875
Function Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total ...