第十一章--- 输入:cin.getline 、getline、cin.fail(); 连续输入一串(未指定个数的)数字,直到按下Enter键结束输入

在C++中,输入是程序与用户交互的重要方式之一。下面将详细讲解如何使用cin.getlinegetline函数来输入数组(字符数组)和字符串。

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.getlinecin 读取输入后,如果输入的数据超过了指定的字符数或缓冲区大小,剩余的数据会留在输入缓冲区中。这可能会导致后续的输入操作出现问题。可以使用 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,用于存储输入的整数。同时定义了两个整型变量 asum,其中 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,则中断循环。这里的目的是允许用户通过按回车键来结束输入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值