在C艹中有两种字符串形式, 一种是C-风格, 另一种是C艹风格的

初始化:

char str[10] = {'a', 'c', 'd', '\0'};
char str[20]= “aaa”;
string str = "aaa";
#include <iostream>
#include <cstring> int main(int argc, char const *argv[]) {
/* code */
using namespace std;
const int Size = ; char name1[Size];
char name2[Size] = "C++owboy"; std::cout << "name2 is :" << name2 << '\n';
std::cout << "name1 :";
std::cin >> name1;
std::cout << "hi, " << name1 << '\n';
std::cout << "name1 strlen is : " << strlen(name1) << '\n';
std::cout << "sizeof (name1) value: " << sizeof (name1) << '\n';
std::cout << name1[] << '\n';
name2[] = '\0';
std::cout << "name2 is " << name2 << '\n';
return ;
}

strlen 和size

#include <cstring>
strlen() 判断字符串的长度 与sizeof的区别
str.size() 属于类方法, str属于对象

string str2 = "panther";
str2.size()
int len2 = strlen(charr2); C-风格
确定字符数

cin的getline和get的区别

std::cin.get(dessert, ArSize).get(); 

与

std::cin.getline(dessert, ArSize) 假设arsize为20, 则实际是取19个, 最后一个为\

的区别

get()函数的弊端:

  cin.get(name, 20);

  cin.get(dessert, 20);

  由于第一次调用后, 换行符将留在输入队列中, 因此第二次调用时看到的第一个字符便是换行符。因此get()认为已到达行尾, 因此不能获取换行符。

  幸运的是get() 有另一种变体, 使用不带任何参数的cin.get()可以读取下一个字符(即换行符)

混合输入字符和数字(有问题,指针时候会解)

字符串的复制和追加

string库里的strcat()就是追加的意思
通过strcat 得知 使用使用string而不是使用c字符串的好处

例如:
char site[] = "house";
strcat(site, " of pancakes");

函数试图将全部12个字符复制到数组site里, 这将覆盖相邻的内存, 可能导致程序终止,或者损坏数据。
string类具有自动调整大小的功能, 可以避免发生。

c里面也有类似函数 strncat() 和strncpy() ,他们接受指出目标数组最大允许长度的第三参数, 但增加写程序的难度

string库里的strcpy()就是复制的意思, 并创建新的内存地址 printf("%p\n", str1);

看指针不一样,证明复制相当于重新创建一个

c++风格字符串输入处理与C-风格字符串输入有什么优势和好处

#include <iostream>
#include <cstring>
#include <string> int main(int argc, char const *argv[]) {
using namespace std;
char charr[];
string str; std::cout << "Length of string in charr before input: " << strlen(charr) << '\n';
std::cout << "Length of string in str before input: " << str.size() << '\n'; std::cout << "Enter a line of text: " << '\n';
std::cin.getline(charr, );
std::cout << "You entered: " << charr << '\n'; std::cout << "Enter a line of text: " << '\n';
getline(std::cin, str);
std::cout << "You entered: " << str << '\n'; std::cout << "Length of string in charr after input: " << strlen(charr) << '\n';
std::cout << "Length of string in str after input: " << str.size() << '\n'; return ;
}

看,我超过范围了造成 溢出, 那么str就不让我输入了

不知道有认真的人注意到了  getline(std::cin, str); 和std::cin.getline(charr, 20); 的区别了吗

我们来分析一下

那么来分析一下为什么?

函数getline()是istream类的一个方法, cin是istream一个对象, 第一个参数是目标数组, 第二个参数是数组长度, getline()使用它来避免越界溢出。

那么:

  getline(std::cin, str);

这个getline()不是类方法, 是将cin作为参数, 指出到哪里查找输入。另外没有指出字符串长度的参数, 因此string对象将根据字符串的长度自动调整自己的大小

其他类型字符串

1. C艹还要其他类型字符串, 比如wchar_t,  C艹11新增加的char16_t 和char32_t, 分别使用前缀L、u、U来表示

  wchar_t title[] = L"Chief Astrogator";
char16_t name[] = u"Felonia Ripova";
char32_t car[] = U"Humber Super Snipe";

2. 还有一种支持Unicode字符串编码的UTF-8方案, 字符可能是1~4个八位组。

   方案是前缀u8来表示这种类型。

3. 原始字符

在原始字符里面, 字符表示的就是自己。例如\n 就是\n 不是换行符, 不需要使用\ 来转义了

那么怎么使用呢?

cout << R"( Jim "King" Tutt users "\n" instead of endl.)" << '\n';

打印出来的是:

Jim "King" Tutt users "\n" instead of endl.

如果是标准字符串怎么写:
cout << “Jim \"King\" Tutt users \"\\n\" instead of endl." << '\n';

在输入原始字符串时候, 按回车键不仅会移到下一行, 还将在原始字符串中添加回车字符。

--------------------------------------------------

在原始字符串中包含”),编辑器遇见第一个会结束吗,会。但原始字符串允许字符串开头的" 和 ( 加其他字符, 使用R“+*( ....)+*"。

例如:

cout << R"+*("(who would;t?)", she whispered.)+*" << endl;

也可以将前缀R与其他字符串前缀结合使用。例如Ru,UR等

C艹复合类型(字符串)的更多相关文章

  1. 实现在GET请求下调用WCF服务时传递对象(复合类型)参数

    WCF实现RESETFUL架构很容易,说白了,就是使WCF能够响应HTTP请求并返回所需的资源,如果有人不知道如何实现WCF支持HTTP请求的,可参见我之前的文章<实现jquery.ajax及原 ...

  2. go语言 类型:基础类型和复合类型

    Go 语言中包括以下内置基础类型:布尔型:bool整型:int int64 int32 int16 int8 uint8(byte) uint16 uint32 uint64 uint浮点型:floa ...

  3. 学习C++.Primer.Plus 4 复合类型

    本章介绍的有复合类型有: 数组. 字符串. 结构. 共用体. 指针 数组: 声明数组时数组长度必须为常量(或const). 只有初始化时可以用“=”,其它时候均不可以给数组直接赋值,除了赋值的元素以外 ...

  4. go - 复合类型 array, slice, map

    Go 语言支持复合类型: 数组:array 切片:slice 指针:pointer 字典:map 通道:chan 结构体:struct 接口:interface 1. array   同一类型数据的集 ...

  5. C++PrimerPlus第6版 第四章——复合类型

    1,复合类型主要包含:数组.结构.联合.枚举.类.指针.引用等. 2,数组.长度必须确定.即编译阶段,数组的长度就得确定好.所以只能使用常量(#define.const)声明数组长度.如果使用变量声明 ...

  6. JS面向对象特性和值类型与复合类型

      JS面向对象之特性已经值类型与复合类型 一些属性 空对象 空对象也是对象, 只是有存变量的变量名, 没有对象属性 var o ={}; 参数传递 值类型: 函数内外两个变量, 两个数据, 都不相同 ...

  7. WebService之Axis2(2):复合类型数据的传递

    在实际的应用中,不仅需要使用WebService来传递简单类型的数据,有时也需要传递更复杂的数据,这些数据可以被称为复合类型的数据.数组与类(接口)是比较常用的复合类型.在Axis2中可以直接使用将W ...

  8. 《C++ Primer Plus》读书笔记之二—复合类型

    二.第四章 复合类型  1.C-风格字符串:C-风格字符串具有一种特殊的性质:以空字符结尾,空字符被写成\0,其ASC||编码为0,用来标记字符串的结尾.例如: char dog[5]={'b','e ...

  9. Hive 文件格式 & Hive操作(外部表、内部表、区、桶、视图、索引、join用法、内置操作符与函数、复合类型、用户自定义函数UDF、查询优化和权限控制)

    本博文的主要内容如下: Hive文件存储格式 Hive 操作之表操作:创建外.内部表 Hive操作之表操作:表查询 Hive操作之表操作:数据加载 Hive操作之表操作:插入单表.插入多表 Hive语 ...

随机推荐

  1. spring boot下JedisCluster方式连接Redis集群的配置

    最近在使用springboot做项目,使用redis做缓存.在外网开发的时候redis服务器没有使用集群配置,所有就是用了RedisTemplate的方式进行连接redis服务器.但是项目代码挪到内网 ...

  2. fork failed.: Cannot allocate memory

    在做压力测试时候: [root@666 ok]# webbench -c 5000 -t30 http://10.100.0.61/ Webbench - Simple Web Benchmark 1 ...

  3. 内网ip范围

    局域网可使用的网段(私网地址段)有三大段:10.0.0.0~10.255.255.255(A类)172.16.0.0~172.31.255.255(B类)192.168.0.0~192.168.255 ...

  4. 【数据库】悲观锁与乐观锁与MySQL的MVCC实现简述

    悲观锁 悲观锁,就是一种悲观心态的锁,每次访问数据时都会锁定数据: 乐观锁 乐观锁,就是一种乐观心态的锁,每次访问数据时并不锁定数据,期待数据并没作修改,如果数据没被修改则作具体的业务 应用程序上使用 ...

  5. 【转】Unity3D中脚本的执行顺序和编译顺序

    支持原文,原文请戳: Unity3D中脚本的执行顺序和编译顺序 在Unity中可以同时创建很多脚本,并且可以分别绑定到不同的游戏对象上,它们各自都在自己的生命周期中运行.与脚本有关的也就是编译和执行啦 ...

  6. Kafka: Producer (0.10.0.0)

    转自:http://www.cnblogs.com/f1194361820/p/6048429.html 通过前面的架构简述,知道了Producer是用来产生消息记录,并将消息以异步的方式发送给指定的 ...

  7. 解决IntelliJ IDEA控制台乱码问题[包含程序运行时的log4j日志以及tomcat日志乱码]

    这里使用的IntelliJ IDEA版本为[IntelliJ IDEA 14.1.4]: 一.控制台打印的程序运行时的log4j日志中包含中文乱码 在IDEA安装目录的bin目录下找到名为" ...

  8. canvas的图片绘制案例

    <!doctype html><html lang="en"><head> <meta charset="UTF-8" ...

  9. django模型查询

    概述 查询集表示从数据库获取的对象的集合 查询集可以有多个过滤器 过滤器就是一个函数,基于所给的参数限制查询集结果 从SQL角度来说,查询集和select语句等价,过滤器就像where条件 查询集 在 ...

  10. tomcat8.5性能优化

    主要是按照两篇文章,部分参数因适配Tomcat8.5进行了调整 一.有关 JAVA_OPTS http://www.open-open.com/lib/view/open1401931407228.h ...