Day_03 复合类型

1.利用cin、cin.get()cin.getline()输入字符串的区别
iostream中的类cin提供了一些面向行的成员函数:get()和getline()

  • cin
    cin使用空白(空格、制表符和换行符)作为字符串的结束位置,这表明cin只能读取输入队列中的一个单词。
  • cin.getline()
    cin.getline()读取整行,使用enter键入的回车符确定读取结束位置,该函数有两个参数,第一个参数为用于存储字符的数组,第二个参数为字符数组的长度。cin.getline()在读取的字符数目达到第二个参数值时或者遇到换行符时停止读取。丢弃换行符补充\0在字符串尾部。
  • get()
    这个方法有几种形式。讨论其中两种,第一种形式与getline()相似,有两个输入参数,都读取到行尾,但与getline()不同的是,这种方法不再读取并丢弃换行符,而是将其留在队列中。第二种形式无参,读取一个字符(即使是换行符),可以这种方式来处理换行符,为下一行输入做准备。

例:

const int strlen = 20;
char str1[strlen];
char str2[strlen];
    
cout << "input using cin:";
cin >> str1;
cin >> str2;
cout << "show the output using cin (string 1st):" << str1 << endl;
cout << "show the output using cin(string 2en):" << str2 << endl;
cin.get();//resolve enter
    
cout << endl;
cout << "input using getline():";
cin.getline(str1,strlen);
cout << "show the output using getline():" << str1 << endl;

cout << endl;
cout << "input using get():";
//execute cin.get(str1, strlen) will return a object,this obiect continue to execute get()
cin.get(str1, strlen).get();
cout << "show the output using get():" << str1 << endl;
运行结果

2.string类的操作
c++中string类的操作可以类比Java中string类的操作,

  • 初始化方式:
//use c type 
char ch1[] = { "hello" };
char ch2[] {"hello"};
//use c++ type
string str1 = { "hello" };
string str2{ "hello" };
string str3 = "hello";
  • 赋值、拼接和附加
//apend string to other string object
str4 = str1 + " world " + str2;
str4 += str3 + "  hi! ";
  • string类的其他操作
strcpy(str1,str2);//copy str2 to str1
strcat(str1,str2);//apending str2 to str1
strlen(str);//length of string object
  • getling()在两种场合的使用
    char ch[20];
    string str;
    /*
    **此处,getline()为类istream中对象cin的成员方法,传入的参数为字符串指针和字符的限制
    */
    cin.getline(ch,20);
    /*
    **此处,getline()为类istream的成员方法,传入的参数为cin对象和string对象
    */
    getline(cin, str);
    cout << ch << endl;
  • 原始字符串
    原始字符串即表示字符本身,如\n就是\n,而不表示换行。其表达式为:
//语法:strSelf = R“(string object)”
cout << R"(i am a man."\n" instead of endl)" << endl;
  • 结构体struct
    定义
struct student {
        string name;
        int years;
        double heigh;
    };

初始化

struct student zhang;//c style 
student li;//c++ style
c++ style initialized student li
student li = { "dsds", 1994, 173.0 };
student li  { "dsds", 1994, 173.0 };
cout << li.name << endl << li.years << endl << li.heigh;
  • 结构体中成员可以为类(如string),可以创建数组(类似基本数据类型数组的创建方法)
  • 共用体(union)
    共用体是一种数据格式,可以存储不同的数据类型。但只能同时存储其中的一种类型。假如结构体只能同时存储intdouble,共用体则只能存储一种,intdouble
    定义:
union num{
    int n;
    double m;
};

在不同的时间可以存储不同类型的数据,如:

num ID;
ID.n = 12;
//restore int and double in difference time
cout << ID.n << endl;
ID.m = 12.12;
cout << ID.m << endl;
  • 数组的替代品
    1.模板类vecter
    模板类vecter类似于string类,也是一种动态数组。可在运行阶段设置vecter长度,可在末尾附加新数据,可在中间加入新数据。可以说它是用new和delete来处理动态数组的替代品。创建一个名为vt的vecter对象且可存储类型为typeName的定义方式为:
    vecter<typeName> vt(elem)
    2.1.模板类array
    vecter功能强大,但是效率低。如果需要固定长度的数组。可以使用模板类array,array对象的长度是固定的。创建一个名为arr的array对象,它包含n_elem个类型为typeName的元素:
    vecter<typeName,n_elem> arr
  • new和delete
    使用指针时,一定要首先对指针初始化,下述做法不可为:
//指针a指向何处,不得而知
    int *a;
    *a = 1;

c++引入了关键字来克服这种问题,提供了一种可以绕过定义变量而直接通过指针操作数据的方法,即通过new关键字为指定类型的数据分配内存(c中为molloc()函数),并提供一个指向该存储单元的指针。其格式为:
typeName *pointerName = new typeName
例如:

//使用解引用(*)指针是,一定要对指针初始话
//使用new关键字寻求一个适合存储int数据的内存
int *p = new int;

值得注意的是,通过new关键字是从堆(heap)或自由空间(free store)中获取存储单元;而直接定义的变量是从栈(stack)中获取存储单元。
new一定要和delete配合使用,使用delete可以释放被定义是分配的存储空间,但不会删除指针本身。如:

int *p = new int;
delete p;

1.使用new创建动态数组
typeName *pointerName = new typeName[element_num]
使用delete删除动态数组
delete [] pointerName
2.创建结构体的两种方式

struct infinite {
        int a;
        float b;
    };
//第一种初始化结构体的方式,需要在定义时初始化
infinite first = {1,1.2};
infinite first { 1, 1.2 };
//访问方式,利用操作符“.”访问成员
int a = first.a;
float b = first.b;
//第2种动态初始化结构体的方式,不用在定义时初始化,利用指针指向该存储空间,操作符“->”访问成员
infinite *second = new infinite;
second->a = 1;
second->b = 1.2;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,517评论 1 51
  • 第一章 计算机与C++编程简介 C++程序6个阶段编程 ->预处理->编译->连接->装入->执行1.程序在编译器...
    rogertan30阅读 3,844评论 0 1
  • C++运算符重载-下篇 本章内容:1. 运算符重载的概述2. 重载算术运算符3. 重载按位运算符和二元逻辑运算符4...
    Haley_2013阅读 1,440评论 0 49
  • 题目类型 a.C++与C差异(1-18) 1.C和C++中struct有什么区别? C没有Protection行为...
    阿面a阅读 7,659评论 0 10
  • Tags:C++,《C++ Primer Plus》笔记 一、分类## 如下图,大概分为这些类型,每种类型的声明语...
    傻沙阅读 1,047评论 0 0