Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何读入用户输入的逗号分隔整数?_C++_Cin - Fatal编程技术网

C++ 如何读入用户输入的逗号分隔整数?

C++ 如何读入用户输入的逗号分隔整数?,c++,cin,C++,Cin,我正在编写一个程序,提示用户: 数组大小 要放入数组的值 第一部分很好,我创建了一个动态分配的数组(必需),并将其设置为用户想要的大小 我被困在下一部分了。用户需要输入一系列以逗号分隔的整数,例如:1,2,3,4,5 如何接收这些int并将它们放入动态分配的数组中?我读到默认情况下cin接受由空格分隔的整数,我可以将其更改为逗号吗 请尽可能用最简单的方式解释,我是编程初学者(对不起!) 编辑:所有的答案就这么多了。问题是我们还没有涵盖向量…是否有一种方法只使用我拥有的动态分配数组 到目前为止,我

我正在编写一个程序,提示用户:

  • 数组大小
  • 要放入数组的值
  • 第一部分很好,我创建了一个动态分配的数组(必需),并将其设置为用户想要的大小

    我被困在下一部分了。用户需要输入一系列以逗号分隔的整数,例如:1,2,3,4,5

    如何接收这些int并将它们放入动态分配的数组中?我读到默认情况下cin接受由空格分隔的整数,我可以将其更改为逗号吗

    请尽可能用最简单的方式解释,我是编程初学者(对不起!)

    编辑:所有的答案就这么多了。问题是我们还没有涵盖向量…是否有一种方法只使用我拥有的动态分配数组

    到目前为止,我的函数是这样的。我在main中创建了一个默认数组。我计划将它传递给这个函数,生成新数组,填充它,并更新指向新数组的指针

    int *fill (int *&array, int *limit) {
    
    cout << "What is the desired array size?: ";                                  
    while ( !(cin >> *limit) || *limit < 0 ) {
        cout << "  Invalid entry. Please enter a positive integer: ";
        cin.clear();
        cin.ignore (1000, 10);
    }
    
    int *newarr;                                                                            
    newarr = new int[*limit]
        //I'm stuck here
    }
    
    int*填充(int*&数组,int*限制){
    cout>*极限)| |*极限<0){
    cout您可以使用下面的
    getline()
    方法:

    #include <vector>
    #include <string>
    #include <sstream>
    
    int main() 
    {
      std::string input_str;
      std::vector<int> vect;
    
      std::getline( std::cin, input_str );
    
      std::stringstream ss(str);
    
      int i;
    
      while (ss >> i)
      {
        vect.push_back(i);
    
        if (ss.peek() == ',')
        ss.ignore();
      }
    }
    
    #包括
    #包括
    #包括
    int main()
    {
    std::字符串输入\u str;
    std::vector-vect;
    std::getline(std::cin,input_str);
    std::stringstream ss(str);
    int i;
    while(ss>>i)
    {
    向量推回(i);
    如果(ss.peek()==',')
    忽略();
    }
    }
    

    代码是从应答中提取和处理的。

    维克托的应答有效,但做的比需要的多。您可以直接调用cin上的ignore(),跳过输入流中的逗号

    此代码所做的是读取输入数组大小的整数,在整数向量中为该数量的元素保留空间,然后循环到指定的元素数量,交替从标准输入读取整数并跳过分隔逗号(调用cin.ignore())。一旦读取了请求的元素数,它将打印出来并退出

    #include <iostream>
    #include <iterator>
    #include <limits>
    #include <vector>
    
    using namespace std;
    
    int main() {
        vector<int> vals;
        int i;
        cin >> i;
        vals.reserve(i);
        for (size_t j = 0; j != vals.capacity(); ++j) {
            cin >> i;
            vals.push_back(i);
            cin.ignore(numeric_limits<streamsize>::max(), ',');
        }
        copy(begin(vals), end(vals), ostream_iterator<int>(cout, ", "));
        cout << endl;
    }
    
    #包括
    #包括
    #包括
    #包括
    使用名称空间std;
    int main(){
    向量VAL;
    int i;
    cin>>i;
    VAL.储备金(一);
    对于(大小j=0;j!=vals.capacity();++j){
    cin>>i;
    VAL.推回(i);
    忽略(数值限制::max(),',');
    }
    复制(开始(VAL)、结束(VAL)、ostream_迭代器(cout,“,”);
    
    cout事先,您应该检查逗号是否存在,然后 如果不是,则声明错误。因此,我将处理 第一个数字分别为:

    std::vector<int> dest;
    int value;
    std::cin >> value;
    if ( std::cin ) {
        dest.push_back( value );
        char separator;
        while ( std::cin >> separator >> value && separator == ',' ) {
            dest.push_back( value );
        }
    }
    if ( !std::cin.eof() ) {
        std::cerr << "format error in input" << std::endl;
    }
    
    std::vector dest;
    int值;
    标准:cin>>值;
    如果(标准::cin){
    目的地推回(值);
    煤焦分离器;
    而(std::cin>>分隔符>>值和分隔符=','){
    目的地推回(值);
    }
    }
    如果(!std::cin.eof()){
    
    std::cerr所有现有的答案都很好,但都是针对您的特定任务的。因此,我编写了一系列代码,允许以标准方式输入逗号分隔的值:

    template<class T, char sep=','>
    struct comma_sep { //type used for temporary input
        T t; //where data is temporarily read to
        operator const T&() const {return t;} //acts like an int in most cases
    };
    template<class T, char sep>
    std::istream& operator>>(std::istream& in, comma_sep<T,sep>& t) 
    {
        if (!(in >> t.t)) //if we failed to read the int
            return in; //return failure state
        if (in.peek()==sep) //if next character is a comma
            in.ignore(); //extract it from the stream and we're done
        else //if the next character is anything else
            in.clear(); //clear the EOF state, read was successful
        return in; //return 
    }
    
    模板
    用于临时输入的结构逗号_sep{//类型
    T;//数据临时读取到的位置
    运算符const T&()const{return T;}//在大多数情况下的作用类似于int
    };
    模板
    std::istream&operator>>(std::istream&in,逗号_sep&t)
    {
    if(!(in>>t.t))//如果我们无法读取int
    返回;//返回失败状态
    if(in.peek()==sep)//如果下一个字符是逗号
    in.ignore();//从流中提取它,我们就完成了
    else//如果下一个字符是其他字符
    in.clear();//清除EOF状态,读取成功
    返回;//返回
    }
    
    示例用法:

    typedef std::istream\u迭代器istrit;//流中的迭代器
    std::vector vec{istrit(in),istrit()};//从两个迭代器构造向量
    

    由于您是一名初学者,现在这段代码可能对您来说太多了,但为了完整起见,我想发布这段代码。

    使用C+11中的新std::stoi函数,代码可以简化一点。转换时它会处理输入中的空格,并且只有当特定令牌以非数字字符开头时才会引发异常。这段代码因此,我们将接受输入

    “12de、32、34、45、45、23xp”

    轻易拒绝

    de12、32、34、45、45、23xp、

    一个问题仍然存在,因为你可以看到,在第一种情况下,它将显示“12, 32, 34,45, 23”,在它已经截断“34 45”到34的末尾。可以添加特殊情况来处理这个错误,或者忽略令牌中间的空白。

    wchar_t in;
    std::wstring seq;
    std::vector<int> input;
    std::wcout << L"Enter values : ";
    
    while (std::wcin >> std::noskipws >> in)
    {
        if (L'\n' == in || (L',' == in))
        {
            if (!seq.empty()){
                try{
                    input.push_back(std::stoi(seq));
                }catch (std::exception e){ 
                    std::wcout << L"Bad input" << std::endl;
                }
                seq.clear();
            }
            if (L'\n' == in) break;
            else continue;
        }
        seq.push_back(in);
    }
    
    std::wcout << L"Values entered : ";
    std::copy(begin(input), end(input), std::ostream_iterator<int, wchar_t>(std::wcout, L", "));
    std::cout << std::endl;
    
    wchar\t in;
    std::wstring seq;
    向量输入;
    std::wcout>std::noskipws>>in)
    {
    如果(L'\n'==in | |(L','==in))
    {
    如果(!seq.empty()){
    试一试{
    输入。推回(标准::stoi(顺序));
    }捕获(标准::异常e){
    标准::wcout
    #包括
    使用名称空间std;
    int main(){
    int x,i=0;
    char y;//用于存储逗号
    int-arr[50];
    而(!cin.eof()){
    cin>>x>>y;
    arr[i]=x;
    i++;
    }
    对于(int j=0;j
    #包括
    使用名称空间std;
    INTA[1000];
    int main(){
    字符串s;
    cin>>s;
    int i=0;
    istringstream d(s);
    b串;
    while(getline(d,b,,')){
    a[i]=stoi(b);
    i++;
    }
    
    对于(int j=0;j您可以使用scanf而不是cin,并在数据类型符号旁边加逗号

    #include<bits/stdc++.h>
    using namespace std;
    int main()
     {
        int a[10],sum=0;
        cout<<"enter five numbers";
        for(int i=0;i<3;i++){
        scanf("%d,",&a[i]);
        sum=sum+a[i];
        }
        cout<<sum;
    }
    
    #包括
    使用名称空间std;
    int main()
    {
    int a[10],和=0;
    
    cout首先,将输入作为字符串,然后解析字符串并将其存储在向量中,您将得到整数

    vector<int> v;
    string str;
    cin >> str;
    stringstream ss(str);
    for(int i;ss>>i;){
        v.push_back(i);
        if(ss.peek() == ','){
            ss.ignore();
        }
    }
    for(auto &i:v){
        cout << i << " ";
    }
    
    向量v; 字符串str; cin>>str; stringstream ss(str); 对于(int i;ss>>i;){ v、 推回(i); 如果(ss.peek()==','){ 忽略(); } } 用于(自动和i:v){
    CUT是否有C++相关的<代码> SPLIT()/>代码:最简单的方式可能需要一些编码,你的开头句子表明你已经在使用这个方法了,看看你目前为止有什么帮助。
    #include<bits/stdc++.h>
    using namespace std;
    int a[1000];
    int main(){
        string s;
        cin>>s;
        int i=0;
        istringstream d(s);
        string b;
        while(getline(d,b,',')){
            a[i]= stoi(b);
            i++;
        }
        for(int j=0;j<i;j++){
            cout<<a[j]<<" ";
        }
    }
    
    #include<bits/stdc++.h>
    using namespace std;
    int main()
     {
        int a[10],sum=0;
        cout<<"enter five numbers";
        for(int i=0;i<3;i++){
        scanf("%d,",&a[i]);
        sum=sum+a[i];
        }
        cout<<sum;
    }
    
    vector<int> v;
    string str;
    cin >> str;
    stringstream ss(str);
    for(int i;ss>>i;){
        v.push_back(i);
        if(ss.peek() == ','){
            ss.ignore();
        }
    }
    for(auto &i:v){
        cout << i << " ";
    }