C++中getline函数多种定义的使用方法

开发 前端
大家可能会发觉,在运行时,通常的输入方式都无法中断循环,有时甚至可能出现难以理解的错误。那么,究竟是什么原因导致了这种情况呢?

getline()函数是一个相当常见的工具,用于从输入流中获取一行数据。

下面我们将详细说明C++中的getline()函数用法,以及在使用getline()函数作为while循环条件时需要注意的问题:

在C++中,getline函数本质上有两种形式:

第一种形式:作为iostream类的成员函数,需要在头文件中声明。

第二种形式:作为普通函数,也需要在头文件中声明。

第一种形式的getline()函数有两种重载形式:

1. istream& getline(char* s, streamsize n);

2. istream& getline(char* s, streamsize n, char delim);

这两种形式的作用都是从输入流中读取最多n个字符(包括终止字符),然后将它们保存在字符数组s中。即使在读取不满n个字符的情况下,如果遇到指定的delim字符或达到字符数限制,读取操作也会终止,而且delim字符不会被保存在s中。

#include <iostream>
// std::cin ;  std::cout ;  std::endl
int main()
{
	char name[256], wolds[256];
	std::cout << "Please input your name: ";
	std::cin.getline(name, 256);
	std::cout << "Please input your wolds: ";
	std::cin.getline(wolds, 256);
	std::cout << "The result is:   " << name << ", " << wolds << std::endl;
	std::cout << std::endl;
	return 0;
}

输入:Mr. Ling

You are fantastic!

输出:

Mr. Ling, You are fantastic!

通过字符数限制和指定终止字符进行修改的代码示例:

#include <iostream>
// std::cin ;  std::cout ;  std::endl

int main(){
	char name[6];

	std::cout << "Please input your name: ";

	std::cin.getline(name, 6, '#');

	std::cout << "The result is:   " << name << std::ends;

	std::cout << std::endl;//学习交流群:558970390

	return 0;
}

输入: //streamsize限定,截断输出 wonderful
输出:wonde

输入: //所设置的结束标识符,截断输出 won#derful
输出:won

第二种方法:在C++中的getline函数具有四种不同的载入形式:

istream& getline (istream& 输入流, string& 字符串, char 分隔符);

istream& getline (istream&& 输入流, string& 字符串, char 分隔符);

istream& getline (istream& 输入流, string& 字符串);

istream& getline (istream&& 输入流, string& 字符串);

这些函数的用法与第一种方法类似,但是它们接受一个输入流作为参数,将读取的内容存储在字符串类型的字符串中。

函数参数的解释:

输入流:表示一个输入流,例如cin。

字符串:这是一个字符串类型的引用,用于保存从输入流中读取的文本。

分隔符:这是一个字符类型的变量,用于指定何时终止读取;如果未自定义分隔符,函数将在遇到换行符'\n'时终止读取。

以下是一个示例代码:

#include <iostream>
#include <string>
int main() {
	std::string name;
	std::cout << "Please input your name: ";
	std::getline(std::cin, name);
	std::cout << "Welcome to here!" << std::ends << name << std::endl;
	std::cout << std::endl;
	return 0;
}

在输入数据时,只有在遇到换行符或文件结束时,才会停止接受输入。

文件结束(EOF)是C语言中用于区分有效数据和输入结束的特殊标志。EOF的输入方式取决于操作系统,例如在Windows下是使用Ctrl+Z,在Linux/Unix下是使用Ctrl+D。

需要注意的是,getline()函数并非C库函数,而是C++库函数。它会在以下情况下终止读取并生成当前字符串:

1. 达到文件末尾。

2. 遇到指定的定界符(默认定界符是换行符,所以遇到换行符时会返回)。

3. 输入达到最大限制。

在下面的示例代码中,我们使用getline()函数在while循环中作为条件判断,实现逐行读取并输出:

#include <iostream>
#include <string>
using namespace std;
int main() {
string line;
while (getline(cin, line))
cout << line << endl;
return 0;
}
```

大家可能会发觉,在运行时,通常的输入方式都无法中断循环,有时甚至可能出现难以理解的错误。那么,究竟是什么原因导致了这种情况呢?接下来我们来详细分析一下:

getline()函数的定义如下:istream& getline(istream & is, string & str, char delim);

在这个语句中,while循环的判断条件实际上是关于cin(标准输入流)的状态,也就是判断当前是否存在有效的输入数据流。

值得注意的是,输入流是一个对象,我们在判断时考虑的是这个流返回的状态。因此,在正常情况下,无论你如何输入,都无法跳出这个循环。

有些人可能会错误地认为while循环的判断条件是关于"line"(即字符串line是否为空)的,试图通过输入回车来中断循环,但却发现这并不奏效。

事实上,回车和设置的分隔符都可以用来终止getline()函数的读取操作。然而,while循环的判断条件实际上是在判断getline()函数的输入流是否有效。

责任编辑:武晓燕 来源: 今日头条
相关推荐

2011-07-13 11:34:58

CC++时间函数

2010-01-26 17:35:09

C++栈

2010-02-02 09:32:32

C++ typedef

2010-03-10 19:18:10

Python scri

2010-01-25 14:10:21

C++堆栈

2010-02-02 09:49:02

C++模板

2024-01-23 10:48:44

C++函数重载开发

2010-02-04 10:52:36

C++字符串分割函数

2011-07-20 14:45:43

C++结构体

2011-07-20 17:31:12

C++

2009-08-28 17:01:43

C#构造函数

2011-07-20 17:48:07

C++

2021-07-16 07:57:35

JavaScriptEval函数

2011-07-20 13:34:37

C++

2024-07-11 14:05:28

JavaScript函数

2024-09-03 13:32:11

JavaScriptEval函数

2009-06-26 10:05:10

获取文件大小

2010-01-25 10:25:19

C++变量

2010-01-27 17:16:52

C++构造函数

2011-05-17 16:20:46

C++
点赞
收藏

51CTO技术栈公众号