cin.getline(char [],int)
如果键盘输入的字符个数大于函数的第二个参数,剩余的字符会留在缓存区中,在这种情况下cin,getline(cahr [],int)会设置失效位,程序后续的读取缓存区动作将被关闭。
可以通过cin.clear()函数来恢复。
string类型:
在C++中,把字符串认为是一种类型,可以由关键字string声明。
虽然它看起来和基础类型非常相似,但是它是一种类,创建的是字符串对象。
例如:string str = "abc";
要使用string类型,需要包含string头文件。
#include<string>
字符串的初始化:
在C语言中对字符串的初始化有两种:
char str[] = {'a','b','c'};
char str[] = "abc";
在C++中,称上述的字符串数组为,C风格的字符串,在C++也保留了字符数组
char str[] = {'a','b','c'};
char str[] = "abc";
string str = "abc";
string str{"abc"};
字符串操作:
在C语言中,对字符串的所有操作,都是通过标准函数完成的:
strcat(char [],cahr []),将第二个字符串追加到第一个字符串,但是这种情况,可能会因为追加之后的字符串的长度超出了第一个字符数组的范围,会写到字符数组内存范围外,很有可能会破坏内存中的其他数据导致程序结束。
strcpy(char [],cahr[]),将第二个字符串复制给第一个字符串,和上述函数存在一样的潜在危险。
在C++中,尽量使用string类型,来对字符串操作,它是大小可变的字符串
sting str1,str2;
str1 += str2;追加操作,不用担心是否溢出
str1 = str2;复制操作,不用担心是否溢出。
总的来说,string对字符串的操作,比字符数组方便和安全。
字符串的输入/输出:
在C++中,所有的基本类型都可以使用智能对象 cin cout来输入和输出。
string类型也可以借助它们来输出和输入,
但是,string和基本类型的cin/cout的实现不同。osteram类设计之初,是没有考虑到string类型的,但是string类型也能用cin/cout能用,是因为友元类,这个后续会仔细解读。
还可以使用getline(char[]/string,int),来获取一行的字符串。
其他形式的字符串字面值:
wchar_t str = L"good morning";
char16_t str = u"good morning";
char32_t str = U"good morning";
C++11中有一种新的类型,原始字符串:
cout << R"(a,b,c,"\n")" << endl;
输出结果是:
a,b,c,"\n"
它没有转义字符,在"( 和 )"中间的所有内容都可以输出。"( 和 )"称为边界
如果需要输出括号,那么就要自定义边界,"和( 之间是可以添加其他字符的作为自定义边界的,但是一定要两边对称。
例如:"+( )+";
结构类型:
结构体内是由用户使用多种不同的数据类型作为基础定义的新类型。
声明如下:
struct inflatable{
char name[20];
string str;
int age;
double tall;
};
关键字 struct 用于声明结构体,inflatable 是这种结构类型的名称,类似于int double这样的基础类型,可以用它声明结构体变量。
例如:
inflatable Lx;
在C语言中的结构体声明变量的时候,是需要加上struct关键字的:
struct inflatable Lx;
初始化:
Lx = {
"Lx",
"big",
20,
180
};
可以在声明结构体变量的时候初始化:
inflatable Lx{“Lx”,“big",20,180};
如果大括号内为空,则所有的元素都会被初始化为0;
调用结构体内部变量的时候,可以使用成员运算符 .
cout << Lx.name;
这里的 Lx.name 是标准的字符组类型,可以进行字符组类型的任何操作。
一般来讲,会把结构体类型定义在所有函数之外,这样,所有的函数都是可以使用的。C++也建议这么做
但是变量一般我们会声明在函数内部。
两个同类型的结构体变量,可以通过 "=" 进行赋值,
结构体可以作为函数的返回值,
可以创建元素为结构的数组
数组结构体的初始化,可以像二维数组一样。
结构体允许占用特定位数的成员,这些成员被称为位字段,
经常用于对硬件寄存器的赋值。