从C语言到C++/STL(一):基本格式

目录

原文章:

说在前头:

一、外部格式:

二、输入输出语句:

1. cin>>与cout<< の简单介绍:

2.cin.get() の介绍:

3.cin.getline() の介绍:

4.getline() の介绍:

5.一个注意点:


原文章:

从C语言到C++/STL(一):基本格式 - 知乎

此文章为作者本人搬运至该网站。

说在前头:

既然是转到c++,那就要遵循c++语言的基本格式以及写法。


一、外部格式:

1.首先,我们先从熟悉的部分开始,一个最最基础的c语言代码显然包含以下格式:

#include<stdio.h>

int main() {
        //代码内容
	return 0;
}

包含include头文件、main函数以及里面的return,

但是到了c++,include里面的就要换成 

#include<iostream>
using namespace std;

int main() {
        //代码内容
	return 0;
}

其中#include<iostream>包含了标准输入/输出流的内容,也就和stdio.h内容差不多。

(可能会有些小伙伴好奇,为什么stdio.h后面带了个.h,iostream没有,我查到的就是,其实也是有iostream.h的,不过c++已经不再支持后缀为.h的头文件了,所以就不用了)

2.下面这个usingnamespace std;,也是必备内容,其实我们记住就好,如果非要探究其原理的话,可以去看一下这个文章:

C++ using namespace std 详解-CSDN博客

【C++】C++中“std::“是什么意思?起什么作用?-CSDN博客

反正我了解到的就是,如果你不写这句话,那么后面的输入输出语句就都需要加上个 std:: 的前缀。所以最好还是加上。

3.另外main函数以及return还是保持不变的。


二、输入输出语句:

c语言的最基本的输入输出语句:

#include<stdio.h>

int main() {
	int a;
	scanf("%d", &a);
	printf("%d", a);
	return 0;
}

而到了c++中,是这样的:

#include<iostream>
using namespace std;

int main() {
	int a;
	cin >> a;
	cout << a;
	return 0;
}

其中scanf和printf分别换成了 cin >> 和 cout <<,

并且经过我自身两个软件的测试,在只有#include<iostream>的情况下,也是可以用scanf和printf的。

C算法:C++中cin和scanf的区别(总结)!!!-CSDN博客

(ps:上面这个链接中所写的第一个区别,我经过测试并没有实现)

printf和cout的区别详述-CSDN博客

对我来说,cin和cout的一大优势就是方便,不用像scanf和printf一样对不同的数据类型还要写%d,%f什么的。


1. cin>>与cout<< の简单介绍:

C++ cin 详解之终极无惑-CSDN博客


这里是省流版:

(1). cin对于每个数据的输出,都要在其左边加上个>>,而cin和scanf对于空格和tab或换行时,都是自动忽略

#include <iostream>
using namespace std;

int main() {
	int a;
	int b;
	char c;
	cin>>a>>b>>c;
	return 0;
}

而这样的话,那么就和scanf对于缓冲区这一部分有所不同,具体可以看这个文章:

scanf的缓冲区问题_什么时候会出现scanf的缓冲问题-CSDN博客

(在这里顺便回顾一下scanf的缓冲区的问题,更便于讲解cin的用法)

    int a;
    int b;
    char op;
    printf("输入两个数:");
    scanf("%d%d", &a,&b);
    printf("输入操作方法:");
    scanf("%c", &op);
    printf(" %d %c %d = ", a, op, b);

文中在实现这个代码时候,会出现:

刚输入完1,空格,2按下回车后,下面那个char类型的op还没来得及输入就结束程序了。

这里的原因其实是这个op数据元素是char类型的,且没有fflush清除缓存,就会有由于第一个scanf之后的回车没有读取(按照 1+空格+2+回车 的格式输入),那么在下一个scanf的时候,由于op是char,那么会把op赋予为回车,这个scanf直接结束。

但是如果不是char类型,而是int类型,或者有fflush清除缓存,那么就不会出现这个情况。

这一点还是挺麻烦的,我原本以为只会在getchar里面出现。

不过cin就不一样了!

#include <iostream>
using namespace std;

int main() {
    int a;
    int b;
    char op;
    cin>>a>>b;
    cin>>op;
    cout <<a<<b<<endl<<op<<endl;
    return 0;
}

这里经过本人测试,无论是char类型还是int类型都不会出现上述问题。

应该是因为当 cin>> 从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>> 会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。

但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>> 不做处理。


(2). cout也挺简单的,

不过首先要先分清,cin右边的符号是 >> 两个大于号,而cout则是 << 两个小于号,这一点要看清!

另外就是上面会有个endl,这个其实就是换行符,和printf中的'\n'一个东西,当然你也可以写:

cout << a << "\nhello\n" << b << '\n' << op <<endl;

左边这个双引号里面的就是输出文本,以及\n这样的特殊负号,中间这个'\n'则是用符号输出,最右边那个endl不多阐述,

就我的经历来看,还是写endl的人比较多。

那么cin和cout基本上就是这样,挺简单的。


2.cin.get() の介绍:

cin.get()为cin的另一版,大致类似于getchar()与gets()的融合,但是也有自己的特异点:

(1).输入一个字符:

这种就类似于getchar(),无论你输入多少个字符,其只接收第一个输入的字符。

需要注意的是,cin.get() 只用于char类型的数据,输入的1也是char类型而不是int类型。

用法:ch = cin.get(); //ch为char类型的数据

或者:cin.get(ch);

#include <iostream>
using namespace std;

int main() {
	char ch;
	ch = cin.get();
        //或cin.get(ch);
	cout << ch;
	//输入:abc,输出:a
	return 0;
}

(*)不过这里有一点需要注意的是,那就是cin.get()和getchar()一样,不会跳过最后的输入完成后的回车键,也就是说,如果你在上面的ch = cin.get();后面又加上了个一样的ch = cin.get();,并且只输入一个字符后回车,就会出现如下场景:

最后cout输出的是回车而不是a。这个情况大家应该已经很熟悉了。


(2).输入字符串数组:

这种类似于gets(),不过与其不同的是,cin.get()输入的是特定长度的字符串数组。

用法:cin.get(arr, 5);

在这里arr为数组名,5为所接收的字符数,不过还要减去1个。也就是说,实际接收的字符有4个,最后一个字符为自动补上的'\0'终止符(其ASCII码值为0,如果这一点不清楚的话可以查一下

深入理解c语言——‘\0’ ,‘0’, “0” ,0之间的区别-CSDN博客

这个)

#include <iostream>
using namespace std;

int main() {
	char arr[10];
	cin.get(arr,5);
	cout << arr[0] << endl;
	cout << arr[1] << endl;
	cout << arr[2] << endl;
	cout << arr[3] << endl << "-------";
	cout << arr[4] << "test" << endl;
	printf("第五个输入字符的ASCII值为:%d", arr[4]);
	return 0;
}

以上代码测试结果如下:

通过cin.get(arr,5)输入abcdef,最终从arr[0]到arr[3]这4个数组元素分别被赋值为abcd,但是a[4]并没有赋上值(------和test之间没有任何东西,连空格也没有),这个就是cin.get(arr,5)的作用。

通过后面的printf可以得出a[4]的元素的ASCII值为0,就是'\0'终止符。

而因为cin.get函数里面的数字写的是5,那么即使这个原数组开辟的空间数大于5且输入的字符也大于了5个,也只有前4个元素被成功赋值,后面都只是'\0'。

另外,cin.get(arr,5)和 ch = cin.get() 对于换行符都是一样的不丢弃法则,比如:

#include <iostream>
using namespace std;

int main() {
	char a[10];
	char b[10];
	cin.get(a,5);
	cin.get(b,5);
	cout << a << "-------" << b;
	return 0;
}

这里只输入了一次的123456789,但是最后a和b的数组都有赋值。

如果想要两次分别输入a和b的话,那么就需要在两个cin中间插入个getchar(),或者cin.get()来吞掉回车(换行符)。


3.cin.getline() の介绍:

cin.getline() 函数用法-CSDN博客

cin.getline()和cin.get(arr,5)一样是用来接收字符串数组的,不过前者相较于后者有两个不同的地方:

(1). cin.getline()可以接收带空格的字符串(经测试,Tab键也是可以的),比如:

#include <iostream>
using namespace std;

int main () {
	char arr[10];
	cin.getline(arr, 5);
	cout << arr[0] << "---" <<endl;
	cout << arr[1] << "---" <<endl;
	cout << arr[2] << "---" <<endl;
	cout << arr[3] << "---" <<endl;
	cout << arr[4] << "---" <<endl;
	return 0;
}

在这里每个数字之间都有空格作间隔,最后的输出结果如图,1和2后面的空格都被赋值给arr[1]和arr[3],而最后一个arr[4]也是和cin.get一样,不存入,是'\0'。

如果按tab键的话就是这样


(2). 其实cin.getline()函数的完整形式有三个参数:

cin.getline(字符数组名, 字符个数, 结束标志);

前两个很明显就是刚才讲到的,但是这最后一个结束标志是什么呢?

结束标志也是个字符,也就是让这个函数在遇到与这个结束标志的字符相同的字符时,就停止输入。

如果其还未达到输入的个数上限的话(比如允许输入8个字符,但是在第3个字符处就遇到了与结束标志相同的字符),那么其也不会因为未达到上限而继续读取,而是会立即停下。

例如:

#include <iostream>
using namespace std;

int main() {
	char arr[10];
	cin.getline(arr, 8, 'z');
	cout << arr << endl;
	return 0;
}

这个代码中的 cin.getline(arr,8,'z'); 就是对arr读取7个字符(还知道为什么是7个吗?第8个的位置要是'\0'呀!),然后在此期间,对每一个读取的字符进行判断,判断其是否为字符z,如果不是,则继续读取下一个字符,如果是的话,那么就不读取这个字符,并结束读取。

在这里我在4个a后面输入了个z,结果程序只读取并赋值了前4个a,遇到z也不赋值,即使数组开辟了8个空间。


4.getline() の介绍:

C++:cin、cin.getline()、getline()的用法_getline(cin,s)函数用法-CSDN博客

getline()也是输入字符串的函数,同样可以读取空格和tab键,不过需要额外加上一个头文件:

#include <string>

既然说到这个头文件,那么就不得不提到#include <string.h>了,

它们两个都是头文件,但是并不相同!

C++中#include<string>与#include<string.h>的区别_#include <string>-CSDN博客

编程小白C语言#include「string.h」常用总结_include<string.h>的作用-CSDN博客

简单来说,string.h可以使用strlen()求字符串数组的长度,strcmp()比较两个字符串数组是否一样、strcpy()字符串数组复制、strcat()字符串数组连接等操作,也是我们初学c语言时候就会了解到的头文件。

而string则定义了一个新的数据类型——字符串:

C++中的String的常用函数用法总结_string函数-CSDN博客

使用string头文件后,我们就可以通过 string str; 这样的方式,像 int a; 一样直接定义数据元素,字符串就不需要再用数组的方式定义了。

#include<iostream>
#include<string>
using namespace std;

int main () {
	string str;
	getline(cin, str);
	cout << str << endl;
	return 0;
}

这里比较简单我就不展示运行结果了。

而需要注意的是,这个getline是不受回车影响的,也就是两个getline可以直接并排放:

#include<iostream>
#include<string>
using namespace std;

int main () {
	string str, str2;
	getline(cin, str);
	getline(cin, str2);
	cout << str << endl;
	cout << str2 << endl;
	return 0;
}

运行结果

另外就是<string>也有很多自带的关于字符串的函数,基本上在这里都有写到:

C++中的String的常用函数用法总结_string函数-CSDN博客

不过到后面真正学到STL的时候应该还会用上,就之后再说吧。


5.一个注意点:

之前刚说过cin会跳过回车,现在getline()又出了个幺蛾子。。。

如下:

#include<iostream>
#include<string>
using namespace std;

int main () {
	string str;
	int a;
	cin >> a;
	getline(cin, str);
	cout << a << endl;
	cout << str << endl;
	return 0;
}

当我们输入1赋值给a之后,在后面的getline()里面就会把回车键赋值给str字符串,从而str输出的也是回车。

也就是很常见的回车问题。

cin和>>遇到回车时的处理_cin>>m>>n;-CSDN博客

对于此,我看了这篇文章,大致意思就是:

cincin不丢会弃回车符,但是 >> 会跳过回车符。所以cin>>出现的时候,其会直接跳过之前遗留的回车符。但是getline()并不会。

所以我们还需要在getline()和cin中间加上个cin.get()或者getchar(),

当然如果觉得比较麻烦的话,也可以在真正写代码的时候自行测试一下,就记住了~~

本资源是压缩包形式的, 里面包含 本书,里面是pdf格式的, 带书签目录,本书是完整版的。 资源都是我自己用过的,不骗大家。 本书作者: 肖俊宇 吴为胜; 出版社: 电子工业出版社 内容简介: 《由浅入深学C++:基础、进阶与必做300题(含DVD光盘1张)》是C++语言的入门教程,较为系统地介绍了C++语言的基础内容。本书共分为3篇22章,详细介绍了C++语言的基础知识、面向对象、标准模块、底层开发和综合案例。本书循序渐进地讲述了C++的基础知识、C++程序的组成及其开发过程、C++程序中的数据、表达式和语句、控制程序流程、数组与字符串、指针与引用、使用函数、函数模板、错误和异常处理、宏和预编译、面向对象的开发、封装、继承、多态、类模板、文件流、标准模板库STL和编程实践等内容。 《由浅入深学C++:基础、进阶与必做300题(含DVD光盘1张)》涉及面广,从基本知识到高级内容和核心概念,再到综合案例,几乎涉及C++开发的所有重要知识。本书适合所有想全面学习C++开发技术的人员阅读,尤其适合没有编程基础的C++语言初学者作为入门教程,也可作为大、中院校师生和培训班的教材,对于C++语言开发爱好者,本书也有较大的参考价值。 章节目录: 第1篇 C++基础篇 第1章 C++概述 1 1.1 引言 1 1.1.1 C++的历史沿革 1 1.1.2 入门C++ 2 1.1.3 编程思想的转变 3 1.2 C++概述 4 1.2.1 C++的特征 5 1.2.2 C与C++的比较 5 1.2.3 C++的应用领域 6 1.3 C++源程序的组成 6 1.3.1 基本组成元素 7 1.3.2 标识符 8 1.3.3 保留字 8 1.3.4 符号 8 1.4 C++集成开发环境——DEV-C++ 9 1.4.1 选择C++编译器 9 1.4.2 安装DEV-C++ 10 1.4.3 DEV-C++ IDE简介 11 1.5 第C++程序——Hello World 11 1.5.1 创建源程序 11 1.5.2 编译运行 13 1.6 小结 14 1.7 习题 14 第2章 变量与数据类型 18 2.1 常量和变量 18 2.1.1 常量 18 2.1.2 变量 21 2.1.3 变量的定义及赋值 22 2.1.4 变量的应用示例 24 2.2 基本数据类型 25 2.2.1 基本数据类型概述 25 2.2.2 整型数据类型 26 2.2.3 浮点型数据类型 27 2.2.4 字符型数据类型 29 2.2.5 布尔型数据类型 30 2.3 变量的作用域 31 2.4 类型转换 32 2.4.1 隐式转换 32 2.4.2 显式转换 33 2.5 小结 34 2.6 习题 34 第3章 表达式与语句 39 3.1 运算符 39 3.1.1 运算符概述 39 3.1.2 算术运算符 40 3.1.3 自增和自减运算符 42 3.1.4 赋值运算符 43 3.1.5 关系运算符 44 3.1.6 逻辑运算符 45 3.1.7 条件运算符 46 3.1.8 逗号运算符 47 3.1.9 位运算符 48 3.1.10 sizeof运算符 49 3.2 运算符的优先级和结合性 50 3.3 表达式 51 3.4 语句 53 3.4.1 空格的作用 53 3.4.2 语句块 54 3.4.3 赋值语句 55 3.4.4 空语句 56 3.5 小结 57 3.6 习题 57 第4章 流程控制结构之顺序结构 63 4.1 程序流程图 63 4.2 表达式语句 64 4.3 格式化输入/输出 65 4.3.1 标准输入流cin 65 4.3.2 标准输出流cout 66 4.3.3 输出流cerr和clog 68 4.4 格式控制函数 69 4.5 格式控制符 71 4.5.1 控制不同进制的输出 72 4.5.2 控制输出宽度 72 4.5.3 控制输出精度 73 4.6 顺序结构综合应用 74 4.7 小结 75 4.8 习题 75
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值