文章目录
- 前言
- cin
- 1. getline(cin, str)
- 2. cin.getline(arr, number)
- 3. cin.get()
- 4. cin >> variable_name
- 5. cin.clear();
- 动态内存
- 1. 可以在动态声名数组的同时进行初始化。
- 数组
- 1. &arr[0]
- 2. &arr
- 3. 数组输入指定长度和非数字时,停止
前言
在写《C++ Primer Plus》课后题过程中,发现的一些函数使用方法、动态内存、数组
cin
cin是istream类(输入流的其一)的一个对象。
抽取运算符 ( > > ) (>>) (>>),cin>>rplace.x返回的也是istream对象。
像 cin >> rplace.x 和cin >> rplace.x >> rplace.y 都将返回一个 istream对象。所以最终返回的结果是cin。
当 cin 被用于测试表达式时,根据输入是否成功,被转换为 bool 值 true 和 false。
struct rect
{double x;double y;
};int main()
{using namespace std;rect rplace;cout << "Enter the x and y values: ";while (cin >> rplace.x >> rplace.y){...}
...
对于结构体rect中,x被设置为了double数值型,所以,当输入不是数值(例如:字符)时,将返回 false,跳出循环。
也可以设置一些特殊的数值,例如有些条件可以考虑负数为终止条件。但是 cin >> 可以接收任何有效数字的输入。
1. getline(cin, str)
当你的程序中使用了 字符串 时,这个时候从键盘获取就需要使用<string>头文件中的 getline()函数
语法:
getline(cin, str);
str是需要接收字符串的变量。
需要头文件 #include <string>
2. cin.getline(arr, number)
接收字符串还可以用数组,这个时候,数组初始化需要一个足够大的数,arr[20]这种可以存储下你需要的字符串。
语法:
cin.getline(arr, number);
其中, arr是你声名的数组名,number是要从缓冲区接收几个字符。空格也不会终止(可以对比cin.get()
3. cin.get()
从键盘接收一个值,通常用于丢弃无用的字符,例如回车之类的。
4. cin >> variable_name
遇到 空格、Tab、回车都会终止。
int m = 0, n=0;cin >> m >> n;cin.get();cout << m << n;
空白符指的是:空格和回车
cin 不会丢弃空白符,但是 >> 符号会跳过空白符。
所以上述代码中的提取出了 n 的值之后,输入流中还有一个回车,下次输入时,会先从输入流中使用这个回车键。所以,正常需要通过cin.get();来释放掉回车键,避免干扰后续输入。
5. cin.clear();
如果之前的输入有错误,为了不终止程序,需要用
cin.clear();
清除错误状态。
比较优秀的代码: “关于清除错误输入,保证输入正确”
这是一个求 阶乘 的代码,前面需要保证输入的是数值型,而且需要判断是大于零的值。
int n;cout << "Enter an integer number: ";while (!(cin >> n)){cin.clear();while (cin.get() != '\n'){continue;}cout << "Please enter an integer number: ";}if (n < 0){cout << "Negative number don't have factorial." << endl;exit(1);}
动态内存
1. 可以在动态声名数组的同时进行初始化。
注: CandyBar 是结构体。
CandyBar *p_candybar = new CandyBar [3] {{"Mocha Munch", 2.3, 350},{"Big Rabbit", 5, 300},{"Joy Boy", 4.1, 430}};
其中,
CandyBar *p_candybar = new CandyBar [3]
动态声名了数组。
之后的 { } 进行了初始化。
数组
数组的指针。
1. &arr[0]
数组名是数组第一个元素的地址。例如数组名为 arr
则
arr == &arr[0];
取的是第一个元素,这个时候, ( & a r r [ 0 ] ) + 1 (\&arr[0])+1 (&arr[0])+1表示的的是第二个元素,增加了一个元素的长度。(等价于 a r r + 1 arr+1 arr+1)
2. &arr
&arr;
&arr 表示整个数组的地址,虽然也是指向第一个元素的位置,但是表示的长度是整个数组的长度。
也就是说 ( & a r r ) + 1 (\&arr)+1 (&arr)+1 增加了一个数组的长度,而不是增加一个元素的长度。
3. 数组输入指定长度和非数字时,停止
Fill_array()将double数组和长度作为参数。当数组被填满或者用户输入了非数字时,输入将停止,返回实际输入多少数字。
int Fill_array(double data[], int max_num) {std::cout << "Enter double numbers (non-digital to quit): " << std::endl;int i = 0;while ((i < max_num) && (std::cin >> data[i]))++i;// return the size of arrayreturn i;
}