Я пишу рациональный класс, где следующие должны быть приемлемые формы ввода:
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;
}
Функции, которые вы показали, неверны. Функция-член 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