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;
}

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
0

Другие решения


По вопросам рекламы [email protected]