Почему нельзя подсчитать количество символов в строке?

Код компилируется, однако при вводе простого выражения "5+3" возникает ошибка `invalid stod argument`. При отладке программы я заметил, что проблема возникает уже при инициализации переменной `std::string expression;` и передаче аргумента в функцию, что приводит к ошибке при чтении символов строки. Можете подсказать, как исправить эту ошибку? 

```cpp
#include <br/>
namespace our {
    enum OPERATORS : char {
        DOT = '.', 
        PLUS = '+', 
        MINUS = '-', 
        DIVISION = '/', 
        MULTIPLICATION = '*', 
        LEFT_BRACKET = '(', 
        RIGHT_BRACKET = ')', 
        SPACE = ' ' 
    }; 

    using elementType = double; 

    // прототипы функций 
    bool isOperator(char c); 
    int getPrecedence(char op); 
    double evaluateExpression(const std::string& expr, size_t& i); 
    double applyOperator(double a, double b, char op); 
    double parseFactor(const std::string& expr, size_t& i); 
    double parseTerm(const std::string& expr, size_t& i); 
} 

// функция для проверки, является ли символ оператором 
bool our::isOperator(char c) { 
    return c == our::PLUS || c == our::MINUS || c == our::MULTIPLICATION || c == our::DIVISION; 
} 

// функция для получения приоритета оператора 
int our::getPrecedence(char op) { 
    if (op == our::PLUS || op == our::MINUS) return 1; 
    if (op == our::MULTIPLICATION || op == our::DIVISION) return 2; 
    return 0; 
} 

// функция для выполнения операций 
double our::applyOperator(double a, double b, char op) { 
    switch (op) { 
        case our::PLUS: return a + b; 
        case our::MINUS: return a - b; 
        case our::MULTIPLICATION: return a * 
```
  • 24 января 2025 г. 5:44
Ответы на вопрос 1
Ваша проблема с ошибкой `invalid stod argument` может быть связана с тем, что строка, которую вы передаете в функции, содержит символы, которые не могут быть преобразованы в число, или вы передаете пустую строку. Однако, чтобы дать более точный ответ и предложить исправления, мне нужно увидеть весь код, включая функцию, где производится ввод данных и вызываются другие функции.

Тем не менее, вот несколько общих рекомендаций, которые могут помочь вам устранить проблемы:

### 1. Проверка входных данных

Если вы получаете строку с выражением (например, `"5+3"`), убедитесь, что перед вами нет лишних символов, таких как пробелы, символы новой строки или другие недопустимые символы. 

Пример:

```cpp
std::string expression;
std::getline(std::cin, expression); // Используйте getline для считывания строки
trim(expression); // Ваша функция для устранения пробелов по краям, если нужно
```

### 2. Проверка на пустую строку

Перед тем как вызывать `stod()`, убедитесь, что строка не пустая:

```cpp
if (expression.empty()) {
    throw std::invalid_argument("Expression cannot be empty.");
}
```

### 3. Обработка пробелов и нечисловых символов

Если вы собираетесь работать с математическим выражением, возможно использование функции `std::stof()` или `std::stod()`, возможно, стоит добавить дополнительные проверки на наличие допустимых символов. Вам также могут понадобиться регулярные выражения для проверки строки.

Пример функции для проверки и удаления пробелов в строке:

```cpp
void trim(std::string& str) {
    str.erase(str.begin(), std::find_if(str.begin(), str.end(), [](unsigned char ch) {
        return !std::isspace(ch);
    }));
    str.erase(std::find_if(str.rbegin(), str.rend(), [](unsigned char ch) {
        return !std::isspace(ch);
    }).base(), str.end());
}
```

### 4. Полный код

Убедитесь, что вы вызываете функции в правильной последовательности и передаете правильные параметры. Ниже приведен пример кода, обрабатывающего простое выражение:

```cpp
#include <iostream>
#include <string>
#include <cstdlib> // Для std::stod и std::invalid_argument

namespace our {
    // как в вашем коде...
    
    double evaluateExpression(const std::string& expr) {
        size_t i = 0;
        return parseTerm(expr, i); // вы должны реализовать parseTerm и другие функции
    }
}

int main() {
    std::string expression;
    std::cout << "Введите выражение: ";
    std::getline(std::cin, expression);
    
    try {
        double result = our::evaluateExpression(expression);
        std::cout << "Результат: " << result << std::endl;
    } catch (const std::invalid_argument& ex) {
        std::cerr << "Ошибка: " << ex.what() << std::endl;
    } catch (...) {
        std::cerr << "Неизвестная ошибка!" << std::endl;
    }

    return 0;
}
```

### Заключение

Если после этих изменений проблема не решится, пожалуйста, предоставьте более полную версию вашего кода, включая то, как вы определяете и вызываете функции. Это позволит мне дать более точные рекомендации.
Похожие вопросы