【问题标题】:Separating denominator and numerator inputs when given a slash c++给定斜杠时分离分母和分子输入c ++
【发布时间】:2015-02-18 04:24:21
【问题描述】:

我对 C++ 比较陌生,我想知道是否可以就我遇到的问题寻求帮助。我将输入作为 A/B 类型的一部分或整数值给出。我需要将 A 值和 B 值分开,以便将它们放入 fracnum 和 fracdnum 变量中。当我给定一个整数值时,问题就来了。这是我的代码:

istream& operator >>(istream& in,  Fraction& frac){
    char slash = '/' ;
    int fracnum;
    int fracdnum;
    int peekchar;
in >>fracnum;
if(in >> slash){
    in >>fracdnum;
}
else{
    in.putback(slash);
    fracdnum = 1;
}

    frac = Fraction(fracnum, fracdnum);
    return in;
    }

我不知道如何拆分两个分数以及如何处理整数。

编辑*****

我试过用scanf方法,但还是不行,这是我的尝试,有人注意到它有什么问题吗?

istream& operator >>(istream& in,  Fraction& frac){
int fracdnum;
int fracnum;
int num_read = scanf("%d/%d", &fracnum, &fracdnum);
if( num_read ==1){
    fracdnum=1;
Fraction(fracnum,fracdnum);
}
else if (num_read == 2){
    Fraction(fracnum,fracdnum);
}

    return in;
    }

这是我用于程序的测试文件:

    // Test input, exception and +=:
    Fraction sum(0);
    Fraction fin;
    cout << "\nSumming fractions. Enter fractions as \"1/2\" or just enter a single integer." << endl;
    cout << "Enter zero to end the summation:" << endl;
    do {
        cout << "Enter a fraction to add to sum: ";
        try {
            cin >> fin;
            sum += fin;
        } catch (FractionException &e) {
            cout << e.what() << endl;
        }
    } while (fin != 0);
    cout << "Sum is: " << sum << endl;


    return 0;

} // end main

【问题讨论】:

    标签: c++ input istream fractions


    【解决方案1】:

    老实说,这是scanf 更简单的情况:

    int num_read = scanf("%d/%d", &fracnum, &fracdnum);
    if(num_read == 1) {
        // scanf read one number
        fracdnum = 1;
    } else if(num_read == 2) {
        // scanf read two numbers
    } else {
        // scanf read nothing: fail
    }
    

    【讨论】:

    • 如何处理没有斜线的整数
    • 它不起作用,这是输出的样子,它在输入零时冻结以结束 smumation:求和分数。输入分数为“1/2”或只输入一个整数。输入零以结束求和:3 输入要添加到总和的分数:总和为:0/1
    • @harmanlitt:尝试getline,然后再尝试sscanf。这可以防止scanf 在查找/ 时弄乱不匹配的输入。它还可以防止scanf 从与传递给operator&gt;&gt; 的流不同的流中读取。
    • @harmanlitt:Ben 是对的,如果您是作为交互式应用程序执行此操作(从您的原始问题中不清楚),那么您想阅读整行,然后解析它。
    • 如何在 sscanf 上使用 getline?对不起,我对此还比较陌生。
    【解决方案2】:

    查看您的scanf 尝试,是的,有很多问题。

    istream& operator>>(istream& in, Fraction& frac)
    {
        int fracdnum;
        int fracnum;
    

    到目前为止一切正常,除了拼写。

        int num_read = scanf("%d/%d", &fracnum, &fracdnum);
    

    糟糕,您只是从stdin 读取而不是in

        if( num_read ==1){
            fracdnum=1;
            Fraction(fracnum,fracdnum);
    

    哎呀,你创建了一个临时的 Fraction 对象,又把它扔掉了。

        }
        else if (num_read == 2){
            Fraction(fracnum,fracdnum);
    

    同样的问题

        }
    
        return in;
    }
    

    这样应该会更好:

    istream& operator >>(istream& in,  Fraction& frac)
    {
       int fracdenom;
       int fracnum;
    
       std::string inputline;
       if (getline(in, inputline)) {
           int num_read = sscanf(inputline.c_str(), "%d/%d", &fracnum, &fracdenom);
           if (num_read > 0) {
               if (num_read < 2) {
                   fracdenom=1;
               }
               frac = Fraction(fracnum,fracdenom);
           }
           else {
               in.setstate(std::ios::failbit);
           }
       }
       return in;
    }
    

    如果您希望空格作为终止符,请使用in &gt;&gt; inputline 而不是getline(in, inputline)

    【讨论】:

    • 我试过这个方法,几乎​​成功了!我现在唯一的问题是当我输入“0”来结束求和并显示求和值时,答案是 0/0。在 sum += fin 之后添加了一个 cout;检查总和值是多少。这些值正在相加,但是当我输入 0 时,总和变为 0/0,输出总和显示为 0/0
    • @harmanlitt:每次添加新分数时,尝试打印总和。 += 可能有错误。
    • 在 sum += fin; 之后添加了一个 cout;检查总和值是多少。这些值正在相加,但是当我输入 0 时,总和变为 0/0,输出总和显示为 0/0
    • @harmanlitt:当您添加0/0 时,我想您的公分母代码失败了。不过,这听起来像是一个全新的问题,因为它与输入无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多