【问题标题】:Input String where Integer should be - C++整数应该是的输入字符串 - C++
【发布时间】:2013-09-25 11:38:28
【问题描述】:

我是一名初学者,在学习 Stroustrup 的原则和实践时遇到了这么一个简单的问题。

仅使用基本元素

#include "std_lib_facilities.h"

int main()
{

double highest = 0;
double lowest = 100;
int i=0;
double sum = 0;
vector <double> inputlist;
double input;
string unit;

cout<<"Type in a number followed by it's unit \n";

while(cin>>input>>unit){

    inputlist.push_back(input);
    sum += inputlist[i];

    if (input >= lowest && input <= highest){
        cout<<input<<" \n";
        ++i;
    }

    else if (input < lowest){
        lowest = input;
        cout<<"\nLowest Number so far \n"<<lowest;
    ++i;
    }

    else if (input > highest){
        highest = input;
    cout<<"\nHighest number so far \n"<< highest;
    ++i;
    }

    else
        cout<<"Lowest is: \n"<<lowest<<"\n\n Highest is: \n"<<highest<<" \n\n and the total is: \n"<<sum;


    if (unit == "ft", "m", "in","cm")
        cout<<unit<<"\n";

    else
        cout<<"cannot recognize unit";
}

keep_window_open();
return 0;
}

当字符“|”时,我需要程序向用户显示总和以及最高和最低值被输入。问题是:我需要在应该输入整数值的地方输入这个。

注意:我对转换了解不多,但尝试了一些,但没有成功。

【问题讨论】:

  • 只保留输入为字符串,测试“|”然后转换为整数。 SO上有很多关于后者的例子。

标签: c++ string integer sum


【解决方案1】:

如果我理解正确,您想从std::cin 中读取int,但是:

int i;
if (std::cin >> i) {
    ...

不适合您的需求,因为可能有 '|' 符号作为终止阅读的信号。

您可以执行以下操作:逐字读取输入 (std::string) 并使用临时 std::istringstream 分别解析这些单词:

std::string word;
if (std::cin >> word) {
    if (word == "|")
        ...
    // else:
    std::istringstream is(word);
    int i;
    if (is >> i) {
        // integer successfully retrieved from stream
    }
}

只需#include &lt;sstream&gt;

【讨论】:

  • 谢谢,这很好用。如果您能非常简短地解释一下,我会非常感激!
【解决方案2】:

用字符串读取值。如果不匹配 |使用以下函数将其转换为双精度:

double toDouble(string s)
{
   int sign = 1, i=0;
   if (s[0]=='-')
      sign = -1, i=1;

   double result = 0, result2 = 0;
   for (; i < s.size(); i++)
     if (s[i] == '.')
       break;
     else
       result = result * 10 + (s[i] - '0');

   for (i = s.size()-1 ; i>=0 ; i--)
     if (s[i] == '.')
        break;
     else
        result2 = result2 / 10 + (s[i] - '0');

   if (i>=0)
      result += result2/10;
   return result * sign;
}

【讨论】:

    【解决方案3】:

    用英寸求和米没有多大意义。因此,您应该考虑将单位转换为比例因子。您可以使用地图来获取比例因子。 即使这有点过头,您也可以使用正则表达式来解析用户输入。如果正则表达式不匹配,您可以测试“|”之类的内容。 在新的 c++ 标准 (http://en.wikipedia.org/wiki/C%2B%2B11) 中,为此目的定义了一个正则表达式库。可惜的是,g++ 正则表达式库有问题。但是你可以使用 boost (http://www.boost.org/doc/libs/1_54_0/libs/regex/doc/html/boost_regex/)。 这是一个例子:

    #include <iostream>
    #include <vector>
    #include <map>
    #include <boost/regex.hpp> //< Pittyingly std::regex is buggy.
    
    using namespace std; ///< Avoid this in larger projects!
    using namespace boost;
    
    int main() {
    
    const string strReFloat("([-+]?[[:digit:]]*\\.?[[:digit:]]+(?:[eE][-+]?[[:digit:]]+)?)");
    const string strReUnit("([[:alpha:]]+)");
    const string strReMaybeBlanks("[[:blank:]]*");
    const string strReFloatWithUnit(strReMaybeBlanks+strReFloat+strReMaybeBlanks+strReUnit+strReMaybeBlanks);
    const regex reFloatWithUnit(strReFloatWithUnit);
    
    const map<const string,double> unitVal= {
        {"m", 1.0},
        {"in", 0.0254},
        {"ft", 0.3048},
        {"cm", 0.01}
    };
    
    double highest = 0;
    double lowest = 100;
    int i=0;
    double sum = 0;
    vector <double> inputlist;
    double input;
    double unitToMeter;
    string unit;
    string str;
    
    while( (cout<<"\nType in a number followed by it's unit \n", getline(cin,str), str != "") ){
    
        smatch parts;
    
        if( regex_match(str,parts,reFloatWithUnit) ) {
            unit = parts[2].str();
    
            auto found = unitVal.find(unit);
            if( found != unitVal.end() ) {
                cout<<unit<<"\n";
                input = found->second * atof(parts[1].str().c_str());
            } else {
                cout << "Unit \"" << unit << "\" not recognized. Using meters.\n";
            }
    
            inputlist.push_back(input);
        sum += inputlist[i];
    
        if (input >= lowest && input <= highest){
            cout<<input<<" \n";
            ++i;
        }
        else if (input < lowest){
            lowest = input;
            cout<<"\nLowest Number so far \n"<<lowest;
        ++i;
        }
    
        else if (input > highest){
            highest = input;
                    cout<<"\nHighest number so far \n"<< highest;
                    ++i;
        }
    
        } else if( str == "|" ) {
            cout << "sum:" << sum << "\n";
        } else {
            cout << "Input not recognized.\n";
        }
    }
    
    return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-28
      • 2017-06-25
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 2020-08-09
      • 1970-01-01
      • 2016-07-14
      相关资源
      最近更新 更多