cin.ignore()函数
cin.ignore()
是一个非常实用的函数,主要用于控制输入流 cin
的行为
cin.ignore(int n = 1, char delimiter = EOF);
n
:一个整数参数,表示要忽略的字符数量。默认值是1,意味着只忽略下一个字符。delimiter
:一个可选的字符参数,表示停止忽略的边界字符。当读取到这个字符时,忽略操作停止,即使还没有达到n
个字符。默认值是EOF
(文件结束标志),在这种情况下,会一直忽略字符直到达到指定的数量n
。
用途
- 清除缓冲区:当你从
cin
读取输入后,可能会有遗留的字符(比如用户输入的多余字符或者换行符)留在输入缓冲区。使用cin.ignore()
可以帮助清除这些不需要的字符,保持输入的清洁。 - 跳过特定字符:如果你想在读取输入前跳过某些特定字符(比如换行符
\n
),可以使用cin.ignore()
并指定相应的停止字符。 - 准备下一次读取:在连续读取输入时,特别是在混合使用
cin
的不同成员函数(如>>
运算符与getline()
)时,使用cin.ignore()
可以避免因缓冲区中残留的字符导致的错误读取。
int number; std::string line; // 读取一个整数 std::cin >> number; // 忽略剩余的输入行,包括换行符 std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // 现在可以安全地读取一整行文本 std::getline(std::cin, line); std::cout << "You entered: " << number << "\nLine: " << line << std::endl;
cin.ignore()
被用来丢弃输入缓冲区中用户输入整数后的任何剩余字符,特别是换行符,这样 getline()
就能正确读取接下来的一整行文本。如果不使用 cin.ignore()
,getline()
可能会立即读取到缓冲区中的换行符,导致看起来像是什么都没输入。
stoll函数
C++中,stoll
函数用于将字符串转换为long long
类型的整数。这个函数非常实用,特别是在处理大整数或者从用户输入、文件等来源读取整数数据时。
long long stoll(const std::string& str, std::size_t* pos = nullptr, int base = 10);
str
:要转换的字符串。pos
:一个可选的输出参数,用于存储第一个未被转换的字符的位置。如果转换成功,它将指向字符串中的下一个字符;如果输入无效,它将不被修改。base
:一个整数,表示用于解释字符串的基数,默认为10(即十进制)。你可以指定2到36之间的任何值来处理二进制到三十六进制的数字。
#include <iostream> #include <string> #include <stdexcept> int main() { try { std::string numberStr = "1234567890123456789"; long long number = std::stoll(numberStr); std::cout << "The number is: " << number << std::endl; // 使用不同的基数 std::string hexStr = "1A"; long long hexNumber = std::stoll(hexStr, nullptr, 16); std::cout << "Hexadecimal '1A' as decimal is: " << hexNumber << std::endl; // 错误处理示例 std::string invalidStr = "123abc"; long long invalidNumber = std::stoll(invalidStr); } catch (const std::invalid_argument& ia) { std::cerr << "Invalid argument: " << ia.what() << std::endl; } catch (const std::out_of_range& oor) { std::cerr << "Out of range error: " << oor.what() << std::endl; } return 0; }
stoll
首先用于将一个非常大的十进制字符串转换为long long
类型。接着,演示了如何使用基数16来转换十六进制字符串。最后,尝试将包含非法字符的字符串转换为数字,这将抛出std::invalid_argument
异常,展示了如何捕获并处理这种错误情况。如果转换的结果超出了long long
所能表示的范围,还会抛出std::out_of_range
异常。