C++【笔记1】

注:C++ Primer Plus,2019-09-11

1 cstring相关I/O

1-1,cin

使用空白(空格,制表符, 换行符)来确定字符串的结束位置,即cin在获取字符数组输入时只获取一个单词,
错误代码示例:

#include<iostream>
#include<cstring>
using namespace std;
int main(){
	
	const int Arsize = 20;
	char name[Arsize];
	char food[Arsize];
	cout << "Enter your name : \n";
	cin >> name;
	cout << "Enter your favourite dessert: \n";
	cin >> food ;
	cout <<"i happen to have " << food << "for you";
	return 0;
} 

运行结果
这里本应该输入两次,但是第一次的输入中含有空格,出现了bug
在这里插入图片描述
正常的结果:
在这里插入图片描述
显然cin不能满足需求,比如有时候用户输入 new york…

1-2 cin.getline()

作用:直接读取行,不会受到空格等的影响。每次读取一行,通过换行符来确定行尾,但不保存换行符,即换行符不会保留在队列中。
参数:1,用来存储输入行的数组的名称,2,需要读取的字符数

cin  >> name 改为: cin.getline(name, Arsize)即可避免这种bug

1-3 cin.get()

与getline机制类似,但是不会删除换行符,换行符会保留在队列中。
使用不当也会造成bug
错误代码:

cin.get(name, Arsize);
cin.get(food, Arsize); 

这样运行是不会读取到food,因为第一行执行结束之后,换行符还保留在队列中,下一个get读取的时候,看到的第一个字符便是换行符,因此变回判断已经到达行尾,执行结束。
解决方案便是在中间插入一个无参数的get: cin.get()

------------------------------------这些方法是真的烦,python用习惯了,好在这是C++,有一个string类

2-1 string类I/O

主要是getline/getline作用于字符串数组和string类的区别
代码如下

int main() {
	char name1[20];
	string name2;
	cin.getline(name1, 20);
	getline(cin, name2);
}

记住会用就行,不必深究原因

2-2

cstring中的 strcat, strcat 对应着 string类的 +=, =运算形式,类似一切皆为对象的python
代码示例:

#include <iostream>
#include <string>
#include <cstring>
using namespace std;
int main() {
	char charr1[20];
	char charr2[20] = "陈壮壮";
	string str1;
	string str2 = "汤小鱼";
	
	cout << "两种字符变量转换操作" << endl;
	str1 = str2;
	strcpy(charr1, charr2);
	cout << "字符串增加字符操作" << endl;
	str1 += "我是一个么的感情的魔教二愣子";
	strcat(charr1, "原来一直喜欢汤小鱼");
	cout << "查询两种字符串的长度 " << endl;
	int len1 = strlen(charr1);
	int len2 = str1.size();

	cout << "the size of charr1 is " << len1 << "characters.\n";
	cout << "the size of str1 is " << len2 << "characters.\n";
	
	return 0;


}

类的计算非常简单,上面的比较看似cstring没多少繁琐步骤,但是碰到复杂的操作就会烦死个人 例如:
str1 = str2 + str3:
cstring就需要两步,因为,这些函数只接受两个参数
strcat (str2, str3)
strcpy (str1, str2)

2-3 长度自适应

最重要的一点,string类具有 自动调整大小的功能,而cstring数组不具备这种功能,如果强行增加字符串导致超出数组原始大小,就会导致程序终止,或者继续运行但数据被破坏,如下:

char charr1[10] = “我是龟仙人”;
strcat(charr1, “他二大爷的小孙子”);// 内存错误,超出原数组范围。

2-4 原始(raw)字符串

截止2019-09-11,Dev c++ 无法运行原始字符串,可能是没有更新

类似python读取文件的时候,如果有的文件开头是字母t,\t编译器就会认为是制表符,导致报错,在字符串前加上字母r即可。
C++中是大写字母R 需要注意的是 原始字符串将 "( 和 )"用作定界符

发布了48 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/NewDreamstyle/article/details/100750019