在C++中,输入是程序与用户交互的重要方式之一。下面将详细讲解如何使用cin.getline
和getline
函数来输入数组(字符数组)和字符串。
1. 使用 cin.getline
输入数组
cin.getline
是 C++ 中的一个函数,用于从输入流中读取一行数据,并将其存储在字符数组中。该函数有三个参数:
- 第一个参数是字符数组,用于存储输入的字符串。
- 第二个参数是字符数组可以存储的最大字符数,包括结尾的空字符
\0
。 - 第三个参数是结束字符,如果指定,那么读取时会忽略这个字符,并且它不会存储在字符数组中。如果省略,默认是换行符
\n
。
下面是一个示例:
#include <iostream>
using namespace std;
int main() {
char arr[20];
cin.getline(arr, 5); // 读取最多4个字符,因为第5个位置留给'\0'
cout << arr << endl; // 输出读取的内容
return 0;
}
在这个例子中,如果用户输入 abcdefg
,那么输出将会是 abcd
。因为 cin.getline(arr, 5)
指定了最多读取4个字符(第5个位置是空字符 \0
),所以输入的 efg
会被留在输入缓冲区中。
2. 使用 getline
输入字符串
在 C++ 中,getline
是一个更常用的函数,用于从输入流中读取一行数据到 string
对象中。这个函数是定义在 <string>
头文件中的。它的使用比 cin.getline
简单,因为它不需要担心字符数组的长度,它会自动根据输入的内容调整字符串的大小。
下面是如何使用 getline
的示例:
#include <iostream>
#include <string>
using namespace std;
int main() {
string str1;
getline(cin, str1); // 读取一行数据到字符串 str1
cout << str1 << endl; // 输出读取的内容
return 0;
}
在这个例子中,用户可以输入任意长度的字符串,直到输入换行符。getline
会读取整行,包括空格,直到遇到换行符,并且换行符不会被存储在字符串中。
注意:
-
清空输入缓冲区:在使用
cin.getline
或cin
读取输入后,如果输入的数据超过了指定的字符数或缓冲区大小,剩余的数据会留在输入缓冲区中。这可能会导致后续的输入操作出现问题。可以使用cin.ignore
来忽略缓冲区中的剩余字符。cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略直到下一个换行符
对
cin.ignore
的讲解请查看以下文章:
第十章—关闭同步流及注意事项及详细分析cin.ignore();
-
错误处理:在使用输入函数时,应该检查输入流的状态,以确保输入操作成功。可以通过
cin.fail()
来检查输入操作是否失败,如果失败,可以使用cin.clear()
来清除错误标志,并使用cin.ignore
来忽略错误的输入。 -
安全性:在使用字符数组时,一定要确保不会发生缓冲区溢出。对于
getline
,由于它是与string
类型一起使用的,所以不需要担心缓冲区溢出的问题。
通过理解和使用这些输入函数,可以更有效地在C++程序中处理用户输入。
当然,让我们进一步拓展关于C++输入的知识。
3. 输入验证:
在使用 cin
读取数据时,验证输入是非常重要的,以确保用户提供的数据是正确的类型,并且符合程序的要求。
以下是一些输入验证的技巧:
- 检查输入流状态:使用
cin.fail()
检查是否因为类型不匹配而导致输入失败。
if (cin.fail()) {
cin.clear(); // 清除错误标志
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略错误输入
// 可以提示用户重新输入
}
- 循环输入直到有效:可以使用循环结构来要求用户重新输入,直到输入有效为止。
int number;
while (!(cin >> number)) {
cout << "Invalid input. Please enter an integer: ";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
4. 连续输入一串(未指定个数的)数字
接收输入的一串未指定个数的数字,这些数字后有空格,直到按下Enter键结束输入,然后计算这些数字的总和并输出。
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> num;
int a = 0, sum = 0;
while (cin >> a) {
num.push_back(a);
sum += a;
if (cin.get ( ) == '\n')
break;
}
cout << sum;
return 0;
}
输入:(未指定输入数字个数)
1 2 3 4 5 6
输出:21
这段C++代码的主要功能是从标准输入(通常是键盘)读取一系列整数,将它们存储在一个std::vector
容器中,并计算这些整数的总和。当用户输入结束后(通过按下回车键),程序会输出所有输入数字的总和。
代码解析
包含头文件
#include <iostream>
#include <vector>
<vector>
头文件定义了 std::vector
模板类,这是一个可以动态改变大小的数组。
定义变量
vector<int> num;
int a = 0, sum = 0;
这里定义了一个 std::vector<int>
类型的变量 num
,用于存储输入的整数。同时定义了两个整型变量 a
和 sum
,其中 a
用于临时存储每次输入的整数,sum
用于累加所有输入整数的总和。
输入循环
while (cin >> a) {
num.push_back(a);
sum += a;
if (cin.get() == '\n')
break;
}
这个 while
循环会持续从标准输入读取整数,直到遇到文件结束符(EOF)或输入失败。对于每一个成功读取的整数:
- 使用
num.push_back(a)
将其添加到num
向量的末尾。 - 使用
sum += a
将其值累加到sum
变量中。 if (cin.get() == '\n')
这一行尝试读取下一个字符,如果该字符是换行符\n
,则中断循环。这里的目的是允许用户通过按回车键来结束输入。