Fork me on GitHub

关于不指定个数的输入问题

用到的知识
  • getline()函数;
  • stringstream类;

getline()函数

c++中有两种getline()函数。

第一种:在头文件中,是istream类的成员函数

第二种:在头文件中,是普通函数

第一种

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

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

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

用法:

从istream中读取至多n个字符(包含结束标记符)保存在s对应的数组中。即使还没读够n个字符,

如果遇到delim或 字数达到限制,则读取终止,delim都不会被保存进s对应的数组中。

第二种

中的getline函数有四种重载形式。

istream& getline (istream& is, string& str, char delim);

istream& getline (istream& is, string& str);

istream& getline (istream&& is, string& str, char delim);

istream& getline (istream&& is, string& str);

用法和上第一种类似,但是 读取的istream是作为参数is传进函数的。读取的字符串保存在string类型的str中。

函数的变量:

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

str :string类型的引用,用来存储输入流中的流信息。

delim :char类型的变量,所设置的截断字符;在不自定义设置的情况下,遇到’\n’,则终止输入。

stringstream类

C++中标准IO库有三大类

iostream : 支持对标准输入输出设备(键盘,显示器)的读写;

fstream: 支持对文件的读写;

stringstream: 支持对string 对象更灵活的处理;

作用:类型转换,词句转换

一. stringstream 一般可以用来实现安全的数据类型转换:

以int 类型为例

  1. int 类型转string 类型

      int a = 50;
       string b;
       stringstream ss;
       ss << a;
       ss >> b;
    
    // 转换后 b="50";
    
  1. string 类型转int

       int a ;
       string b = "100";
       stringstream ss;
       ss << b;
       ss >> a;
    
    // a= 100
    
  1. string 转wstring (string -> int -> wstring)

    int a;
    string b = “100”;
    wstring c;
    stringstream ss;
    ss << b;
    ss >> a;
    cout<<a<<endl;

    wstringstream ws;
    ws << a;
    ws >> c;
    wcout<<c<<endl;

此种转换有一定的局限性,只能用于string 内容为数字的转换;

二. 利用stringstream 实现句子与单个单词之间的转换;

  1. 句子 转为单个的词

    string a ="how old are you , dear ?";
    stringstream ss;
    ss << a;
    string b;
    while(ss >> b)
    {
    cout <<b<<endl;
    }
    
  1. 单个的词拼接为句子

    stringstream ss;
    ss << "how"<<" "<<"old"<<" "<<"are"<<" "<<"you"<<" "<<","<<"dear"<<" "<<"?";
    string b;
    b = ss.str();
    cout<<b<<endl;
    

代码模板

string line, word;
getline(cin, line);  //将输入流cin以回车键截断,将截断的流的内容赋值给line
stringstream stream(line);  //将line的内容转化为流输入到stream
while(stream >> word)  //将流的内容以空格分割输入到word
{
    //Your code
}
string line, word;
getline(cin, line);
stringstream stream(line);
while(stream >> word)
{
    //Your code
}
Adhere to original technology sharing, your support will encourage me to continue to create!