C ++:为什么不擦除()删除字符串中的第一个字符?

时间:2014-04-18 23:21:26

标签: c++ string if-statement erase rational-numbers

我正在写一个理性的类,其中以下必须是可接受的输入形式:

3 / 4,1.4545,(7/8,(7/8),7/8),或者甚至((((((5/4))),我的代码应该将其重写为5/4让构造函数接受。

此时我将一个字符串参数传递给一个构造函数,该构造函数分别调用formatStringNumerator()和formatStringDenominator();

我还没有得到小数,但到目前为止,左边有一个括号的输入将分子值设置为0。我认为错误是"("在数字之前。我已经评论了我试图将括号移到左边,但他们只是赢了但是没有消失。我&# 39;我试图使用substr()作为替代,但只是在我这样做时出错。另外,当我打印出find()值时,我得到一些大数字,[18446744073709551615]当参数找不到时?我是在印象中它应该返回-1(假?)如果没有找到。

在第一个注释中,erase()应该删除字符串中的第一个字符,作为括号,但它不会自行删除,并且从字符串到int的转换变得混乱,将其默认为0我之前提到过?

int formatStringNumerator(string &rational){
    string tmp;
    int numerator;
//  if(rational.find("(") != false){
//      rational.erase(0, 1); 
//  }          //This should have deleted an open parenthesis
    if(rational.find("/") != false){
        tmp = rational.substr(0, rational.find("/"));
        cout << "\n" << tmp << endl; //cout to test if ran
    }        //Should assign numbers leading to the symbol("/") to tmp
    istringstream is;
    is.str(tmp);    //Numerator should have int value with parenthesis removed
    is >> numerator;
    return numerator;
}
int formatStringDenominator(string &rational){
    string tmp;
    int denominator;
    if(tmp.find("/") != false){
        tmp = rational.substr((rational.find("/")+1));
    }  //assign value after symbol to tmp
//  if(tmp.find(")") != false){
//      tmp.erase(tmp.find(")"));    //Successfully removes parenthesis
//      cout << "\n" << tmp << endl; //Bad condition in if statement?
//  }                                    //cout to test if ran
    istringstream is;
    is.str(tmp);
    is >> denominator;
    return denominator;
}

1 个答案:

答案 0 :(得分:0)

你展示的功能是错误的。类find的成员函数std::string不返回bool值。它返回类型为std::string::size_type的对象。例如,第一个函数可以按以下方式查找

int formatStringNumerator( const string &rational )
{
    string tmp( rational, 0, rational.find("/") );

    tmp.erase( 0, tmp.find_first_not_of( "(" ) );

    return ( tmp.empty() ? 0 : std::stoi( tmp ) );
}

以下是使用函数

的示例
#include <iostream>
#include <string>
using namespace std;

int formatStringNumerator( const string &rational )
{
    string tmp( rational, 0, rational.find("/") );

    tmp.erase( 0, tmp.find_first_not_of( "(" ) );

    return ( tmp.empty() ? 0 : std::stoi( tmp ) );
}

int main() 
{
    std::string s( "((((12/15" );

    std::cout << formatStringNumerator( s ) << std::endl;

    std::string t( "((((12" );

    std::cout << formatStringNumerator( t ) << std::endl;

    std::string u( "((((" );

    std::cout << formatStringNumerator( u ) << std::endl;
    return 0;
}

输出

12
12
0