C++: Почему erase() не удаляет первый символ в моей строке?

Я пишу рациональный класс, где следующие должны быть приемлемые формы ввода:

3/4, 1.4545, (7/8, (7/8), 7/8) или даже ((((((5/4))), где мой код должен переписать его как 5/4 для конструктора принять.

На этом этапе я передаю строковый параметр в конструктор, который вызывает formatStringNumerator() и formatStringDenominator() соответственно;

Я еще не дошел до десятичных дробей, но пока что входные данные с круглыми скобками слева устанавливают значение числителя как 0. Я считаю, что ошибкой является "(" перед цифрами. Я прокомментировал мою попытку убрать скобки слева, но они просто не исчезнут. Я попытался использовать substr () в качестве альтернативы, но только что получил ошибки, когда я это сделал. Кроме того, когда я распечатываю значение find (), я получаю большое число, [18446744073709551615], когда параметры не могут быть найдены? У меня было впечатление, что он должен вернуть -1(false?) если не найден

При первом комментарии 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 ответ

Решение

Функции, которые вы показали, неверны. Функция-член 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
Другие вопросы по тегам