要使用数据类型转换浮动的字符串

时间:2013-09-24 05:10:54

标签: c++ string type-conversion

我正在努力运行这段代码。我正在尝试确定我输入的float值是否与float相同。这是我的编码。

#include <iostream>
#include <string>

using namespace std;

int main()
{
    float x1, y1, x2, y2, x3, y3, percentage;
    string sym1, sym2;
    int count;

    cout<<"Enter the first fraction : ";

    do{
        cin>>x1>>sym1>>y1;

        if(x1 != float(x1) || sym1 != string(sym1) || y1 != float(y1))
        {
            cout<<"Please enter the correct fraction : ";
        }
        else if(sym1 != "/")
        {
        cout<<"Sorry. This is not a fraction. Please enter again : ";
        }
        else
        {
            break;
        }
    }while(x1 == float(x1) || sym1 == string(sym1) || y1 == float(y1));

    cout<<"Enter the second fraction : ";

    do{
        cin>>x2>>sym2>>y2;

        if(x2 != float(x2) || sym2 != string(sym2) || y2 != float(y2))
        {
            cout<<"Please enter the correct fraction : ";
        }
        else if(sym2 != "/")
        {
            cout<<"Sorry. This is not a fraction. Please enter again : ";
        }
        else
        {
            break;
        }
    }while(x2 == float(x2) || sym2 == string(sym2) || y2 == float(y2));

    x3 = x1 * x2;
    y3 = y1 * y2;

    percentage = (x3*100)/y3;

    cout<<x1<<"/"<<y1<<" and "<<x2<<"/"<<y2<<" is "<<x3<<"/"<<y3<<"\n";
    cout<<x3<<"/"<<y3<<" is "<<percentage<<"%";

    return 0;
}

我想要改变的代码就是这个

    do{
        cin>>x1>>sym1>>y1;

        if(x1 != float(x1) || sym1 != string(sym1) || y1 != float(y1))
        {
            cout<<"Please enter the correct fraction : ";
        }
        else if(sym1 != "/")
        {
        cout<<"Sorry. This is not a fraction. Please enter again : ";
        }
        else
        {
            break;
        }
    }while(x1 == float(x1) || sym1 == string(sym1) || y1 == float(y1));

似乎当我输入4/6或任何其他相关的分数格式时,它会正确读取。同样是4 * 6,它打印出预期的输出。但当我输入/ 6或6 / a时,它会进入逻辑错误,无限循环。它就像在if语句和while语句中的数据转换中的某个地方一样错误。还是因为使用的数据类型错了?我无法追查问题所在。有没有解决方法如何做到这一点?请帮忙。先谢谢兄弟姐妹。

1 个答案:

答案 0 :(得分:1)

任何这些比较都无法返回false。

if(x1 != float(x1) || sym1 != string(sym1) || y1 != float(y1))
{
    cout<<"Please enter the correct fraction : ";
}

x1y1是浮点数,将它们转换为浮点值不会以任何方式改变它们的值。 std::string比较运算符还会比较字符串的内容,因此此比较也将始终返回true。

您正在使用与循环条件相同的语句,这会导致您的无限循环。尝试仅使用if(sym1 != "/")两种情况(更好的是:仅评估比较一次,并将结果存储在布尔值中。当你稍后改变某些东西并忘记在任何地方改变它时,两次做事会导致错误。)

有关operator>>工作原理的详细信息,请参阅例如: cppreference

引用:

直到C ++ 11:

  

如果提取失败(例如,如果输入了预期数字的字母),则值保持不变,并设置failbit。

从C ++ 11开始:

  

如果提取失败,则将零写入值并设置failbit。如果   提取导致值太大或太小而无法适应   value,std :: numeric_limits :: max()或std :: numeric_limits :: min()   写入并设置failbit标志。