如何在一行中用户输入c ++中的数组元素

How to user input the array elements in c++ in one line

本人初学c++,基本上属于PHP。所以我正在尝试编写一个程序来练习,对数组进行排序。我已经成功创建了静态数组值为

的程序
// sort algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::sort
#include <vector>       // std::vector


bool myfunction (int i,int j) { return (i<j); }

struct myclass { bool operator() (int i,int j) { return (i<j);} } myobject;

int main () {
   int myints[] = {55,82,12,450,69,80,93,33};
  std::vector<int> myvector (myints, myints+8);               

  // using default comparison (operator <):
  std::sort (myvector.begin(), myvector.begin()+4);           

  // using function as comp
  std::sort (myvector.begin()+4, myvector.end(), myfunction); 

  // using object as comp
  std::sort (myvector.begin(), myvector.end(), myobject);     

  // print out content:
  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
    std::cout << '\n';

  return 0;
}

它的输出没问题。但我希望元素应该从用户输入 space separated 或 , separated 。所以我试过了

int main () {
    char values;
    std::cout << "Enter , seperated values :";
    std::cin >> values;
  int myints[] = {values};


  /* other function same */
}

它在编译时没有抛出错误。但是 op 并不像要求的那样。这是

Enter , seperated values :20,56,67,45

myvector contains: 0 0 0 0 50 3276800 4196784 4196784

------------------ (program exited with code: 0) Press return to continue

将所有值读入一个字符串,然后使用分词器分离出各个值。

How do I tokenize a string in C++?

让我们看看你写了什么:

int main () {
    char values;
    std::cout << "Enter , seperated values :";
    std::cin >> values; // read a single character
    int myints[] = {values}; // create a static array of size 1 containing the single character converted to an int

    /* other function same */
}

您需要的是:

#include <sstream>
#include <string>

...

int main () {
    std::cout << "Enter space seperated values :";
    std::vector<int> myvector;
    std::string line;
    std::getline(std::cin, line); // read characters until end of line into the string
    std::istringstream iss(line); // creates an input string stream to parse the line
    while(iss >> value) // so long as values can be parsed
        myvector.push_back(value); // append the parsed value to the vector

    /* other function same */
}

如果您想要以逗号分隔的输入,除了整数值之外,您还需要将逗号解析为单个字符。

您可以使用这个简单的例子:

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>

using namespace std;

int main()
{
    stringstream ss;
    string str;
    getline(cin, str);
    replace( str.begin(), str.end(), ',', ' ');
    ss << str;

    int x = 0;
    while (ss >> x)
    {
        cout << x << endl;
    }
}

Live demo


或者,如果你想让它更通用并且很好地包含在返回 std::vector 的函数中:

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <vector>

using namespace std;

template <typename T>
vector<T> getSeparatedValuesFromUser(char separator = ',')
{
    stringstream ss;
    string str;
    getline(cin, str);
    replace(str.begin(), str.end(), separator, ' ');
    ss << str;

    T value{0};
    vector<T> values;
    while (ss >> value)
    {
        values.push_back(value);
    }

    return values;
}

int main()
{
    cout << "Enter , seperated values: ";
    auto values = getSeparatedValuesFromUser<int>();

    //display values
    cout << "Read values: " << endl;
    for (auto v : values)
    {
        cout << v << endl;
    }
}

Live demo

你在做什么

int main () {
    char values; //Declare space for one character
    std::cout << "Enter , seperated values :"; //Ask user to enter a value
    std::cin >> values; //Read into values (one value only)
  int myints[] = {values}; // assign the first element to the ASCII code of whatever user typed.


  /* other function same */
}

在语言中 char 作为 8 位整数。通过函数重载,可以实现不同的行为。阅读有关静态多态性的更多详细信息。

你需要做什么

std::vector<int> values;
char ch_in;
std::string temp;
while(cin.get(ch_in)) {
    switch(ch_in) {
         case ',':
         case ' ': //Fall through
             values.push_back(atoi(temp.c_str()); //include cstdlib for atoi
             temp.clear();
             break;
         default:
             temp+=ch_in;
    }
}

你应该把它放在一个单独的函数中。有了这个框架,您可以通过添加更多案例来实现更奇特的语法,但是您需要 std::vector<int> 以外的其他东西来放入东西。您还可以(应该?)在 default 情况下添加错误检查:

         default:
             if( (ch_in>='0' && ch_in<='9') 
                 || (temp.size()==0 && ch_in=='-') ) {
                 temp+=ch_in;
             }
             else {
                 cerr<<ch_in<<" is an illegal character here."
                 temp.clear();
             }

上面的答案对于任意数量的输入都很好,但是如果你已经知道要输入多少个数字,你可以这样做:

int[5] intList;
std::cin >> intList[0] >> intList[1] >> intList[2] >> intList[3] >> intList[4]

但请注意,此方法不会检查数字是否正确放置,因此如果输入中包含字母或特殊字符等,您可能会遇到意外行为。

#include <iostream>
#include <string>
#include <sstream>
#include <string.h>
using namespace std;
// THIS CODE IS TO GIVE ARRAY IN ONE LINE AND OF DESIRED LENGHT ALSO WITH NEGATIVE NUMBERS
// You can also do it by using ASCII but we Are using library name
//   <sstream>   to convert string charters to numbers
//O(n) time complexity
int main()
{
/*
// INPUT
// 7 array length
// 34-56-789   // without space b/w them */
    int N;
    cout << "Enter the size of the array " << endl;
    cin >> N;
    cout << "INPUT Without giving space b/w " << endl;
    string strx;
    cin >> strx;
    int X[N]; // array to store num
    int p = 0;
    // NOTE USE HERE STRX.LENGHT() becouse we have to go through the whole string
    for (int i = 0; i < strx.length(); i++)
    {   // we have declare tempx to store a particular character
        // one time
        string tempx;
        tempx = strx[i];
        stringstream strtointx(tempx);
        //  this is the syntax to convert char to int using <sstream>
        if (strx[i] == '-')
        {
/*
 The tricky point is when you give string as 1-23
 here - and 2 are the separte characters so we are not
getting -2 as number but - and 2 so what we do is 
we chek for '-' sign as the character next to it 
will be treated as negative number 
 */
        tempx = strx[i + 1];
// by assigning strx[i+1] to tempx so that we can getting the which should be treated as negative number
        stringstream strtointx(tempx);
// still it is a charter type now again using library
// convert it to int type
            strtointx >> X[p];
            X[p] = -X[p];
// now make that number to negative ones as we want it to be negative
            i++;
// inside this if i++ will help you to skip the next charcter of string
// so you can get desired output
        } 
        // now for all the positive ones to int type
        else{   strtointx >> X[p];     }
         p++; // finally increment p by 1 outside if and else block
        }
    // loop ends now get your desired output
    cout<<"OUTPUT "<<endl;
    for (int i = 0; i < N; i++)
    {
        cout << X[i] << " ";
    }
    cout<<endl;
    cout<<"CODE BY MUKUL RANA NIT SGR Bch(2020)";
    return 0;
}


// OUTPUT
/*
Enter the size of the array 
7
INPUT Without giving space b/w 
34-56-789
OUTPUT 
3 4 -5 6 -7 8 9
CODE BY MUKUL RANA NIT SGR Bch(2020)
PS C:\Users\user\Desktop\study c++> 
*/


// CAUTION :
/*
1) do not give input with spaces 
****  if you do then first you have to change /chek the code for spaces indexes also ***
2)do not give charates as 56-89@#13 as you want here only numbers 
3) this only for integer if you want to float or double you have to do some changes here 
 because charters index and length would be difeerent in string.
*/