C++(六)— 输入方式

1、输入包含空格的字符串

  使用 getline(cin, str)读取一行字符串,遇到换行符停止;cin>>str,是遇到空格就停止。

实现:输入两个字符,在第一个字符中删除第二个字符中出现的所有字符。
int
main() { string str1; string str2; getline(cin, str1);//输入是“abc smd djndje” getline(cin, str2); map<char, int> m; for (int i = 0; i < str2.size(); ++i) m[str2[i]]++; for (int i = 0; i < str1.size(); ++i) { if (m.count(str1[i]) == 1) { str1.erase(i, 1); //这里删除后,索引要减一 i--; } } cout << str1; cout << endl; system("pause"); return 0; }

 

 

2、第一行输入数组长度,第二行数组

例:

3

1  2  3

cout << "please input the number of vector's element" << endl;
    int num;
    cin >> num;
    vector<int> v;
    int temp;
    for (int i = 0; i < num; ++i)
    {
        cin >> temp;
        v.push_back(temp);
    }
    for (int i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }

3、输入一组数,不知道长度,遇到回车结束

例:

1  2  3 回车

    vector<int> v;
    int temp;
    while(cin>>temp)
    {
        v.push_back(temp);
        //等价于if (cin.get() == '\n') 
        if (getchar() == '\n') //遇回车结束
            break;
    }
    for (int i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }

 4、输入一维数组,保存到 vector 中

例:

输入:[11,33,55,666]
输出:11 33 55 666
#include <vector>
#include <string>
#include <iostream>
using namespace std;

void SplitString(const string& s, vector<int>& v, const string& c)
{
    int  pos1=0, pos2;
    pos2 = s.find(c);
    while (string::npos != pos2)
    {
        v.push_back(stoi(s.substr(pos1, pos2 - pos1)));
        pos1 = pos2 + c.size();
        pos2 = s.find(c, pos1);
    }
    if (pos1 != s.length())//如果有最后一个数,将其加入到数组中
        v.push_back(stoi(s.substr(pos1)));
}

int main() {
    string s = "[11,33,55,666]";
    s = s.substr(1, s.size() - 2);

    vector<int> v;
    SplitString(s, v, ","); //可按多个字符来分隔;
    for (int i = 0; i < v.size(); ++i)
        cout << v[i] << " ";
    cout << endl;
    //输出: a b c d e f
}

  或者使用getline()函数

vector<int> stringToIntegerVector(string input) {
    vector<int> output;
    input = input.substr(1, input.length() - 2);
    stringstream ss;
    ss.str(input);
    string item;
    char delim = ',';
    while (getline(ss, item, delim)) {
        output.push_back(stoi(item));
    }
    return output;
}

int main() {
    string line;
    while (getline(cin, line)) {
        //将输入的字符串转换为数组
        // [1,2,3,4] -> 存入到 vector 数组中
        vector<int> nums = stringToIntegerVector(line);

        int ret = Solution().maxProduct(nums);//你自己的计算函数

        string out = to_string(ret);
        cout << out << endl;
    }
    return 0;
}

 

5、上面4的另一种写法,输入字符,保存字符

   区别:getline()的方法只能用单个字符来进行分割。getline每遇到一个行分割符都会返回一次,所以对于分割符连续的情况就束手无策了。

#include <vector>
#include <string>
#include <iostream>
#include <sstream>
using namespace std;

void split(const string &s, vector<string> &v, char c) {
    stringstream ss;
    ss.str(s);
    string item;
    while (getline(ss, item, c)) {
        v.push_back(item);
    }
}

int main()
{
    string line = "asd fasdf fadf fa";
    vector<string> strs;
    split(line, strs, ' ');
    for (auto &s : strs) {
        cout << s << endl;
    }
    return 0;
}

6、 输入二维数组,保存到vector矩阵中

例:

输入:[[1,2,3],[4,5,6]]
输出:保存到二维数组矩阵中
//[[1,3,1],[1,5,1],[4,2,1]] -> 保存到二维数组中
vector<vector<int>> stringToIntegerMatrix1(string input)
{
    vector<vector<int>> output;
    vector<int> temp;
    input = input.substr(2, input.length() - 4);
    stringstream ss;
    ss.str(input);
    string item;
    char delim = '[';
    while (getline(ss, item, delim)) {
        item = item.substr(0, item.length() - 2);
        temp = stringToIntegerVector(item);
        output.push_back(temp);
    }
    return output;
}

 

 

7、获取数组长度

#include<iostream>
#include<stdio.h>
//获取数组的长度
template<typename T>
int count(T& x)
{
    int s1 = sizeof(x);
    int s2 = sizeof(x[0]);
    int result = s1 / s2;
    return result;
}

1、基本用法

最基本,也是最常用的用法。

       //输入数字
    int a, b;
    cin >> a >> b;
    cout << a << '\n' << b << '\n' << endl;

    //输入abcds,输出 a ,只能获取一个字符
    char ch;
    ch = cin.get();
    cout << ch << endl;
    
    char ch1[10];
    cin.get(ch1, 5);//输入 abcdefg,输出  abcd,还有一个保存‘\0’
    cout << ch1 << endl;

    //输入字符串,回车结束
    string str;
    cin >> str;
    cout << str << endl; 

  区别:

  (1)cin.get(arrayname,size)当遇到[enter]时会结束目前输入,他不会删除缓冲区中的[enter]

  cin.getline(arrayname,size)当遇到[enter]时会结束当前输入,但是会删除缓冲区中的[enter]

/*
    输入:12345[enter]
    输出:12345 【换行】 10

    说明:cin.get(a,10)把12345到a中,
    遇到[enter]结束,但是不把[enter]删除,
    则把[enter]输入到b中,(enter的ASCALL码为10)
    */
    char a[10]; char b;
    cin.get(a, 10);
    cin.get(b);
    cout << a << endl << int(b);
/*
    输入:12345[enter]a[enter]
    输出:12345【换行】97

    说明:cin.getline(a,10)吧12345输入到a中,遇到{enter}结束,
    并把缓冲区中[enter]删除,把接下来的a输入到b中
    */
    char a[10]; char b;
    cin.getline(a, 10);
    cin.get(b);
    cout << a << endl << int(b);

  (2)cin.getline(arrayname,size,s)当遇到s时会结束输入,并把s从缓冲区中删除

  cin.get(arrayname,size,s)当遇到s时会结束输入,但不会删除缓冲区中的s

/*
    输入:12345,[enter]
    输出:12345【换行】 ,

    说明:cin,get不会删除缓冲区的,
    */
    char a[10]; char b;
    cin.get(a, 10, ',');
    cin.get(b);
    cout << a << endl << b;
/*
    输入:12345,[enter]
    输出:12345【换行】10
    
    说明:cin.getline吧12345输入到a中,遇到’,
    ‘结束,并删除缓冲区的’,‘,后面的[enter]输入到b中
    */
    char a[10]; char b;
    cin.getline(a, 10, ',');
    cin.get(b);
    cout << a << endl << int(b);

  应用举例:输入五个学生的名字,每个学生的名字不超过10个字符,输入时学生名字之间用逗号隔开,把这五个名字存储并换行输出

char a[5][10];
    int i;
    for(i=0;i<4;i++)
        cin.getline(a[i],10,',');
    cin.getline(a[i],10);
 
    for(i=0;i<5;i++)
        cout<<a[i]<<endl;

 

posted @ 2018-08-03 15:26  深度机器学习  阅读(977)  评论(0编辑  收藏  举报