注: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 需要注意的是 原始字符串将 "( 和 )"用作定界符