Подсчет количества символов в двойных кавычках - PullRequest
0 голосов
/ 01 апреля 2020

Я хочу найти количество символов внутри двойной кавычки.

Например:

Случай 1

«Hello World» , "Some

output: Ошибка // пропущены кавычки после Some

Case 2

" Hello Word "," Some "

output: 14 // Все кавычки завершены

Я написал программу для подсчета общего количества символов, индекса первой кавычки и общего количества кавычек с использованием рекурсии.

Какой подход мне использовать для решения этой проблемы?

Ответы [ 3 ]

2 голосов
/ 01 апреля 2020

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

Вместо использования рекурсии, вы можете использовать этот более простой подход, который выполняется за линейное время :

void countCharsWithinDoubleQuotes(const std::string& input)
{
    size_t ans = 0;
    bool quoteStarted = false;

    // Iterate through the string and get the required counts
    for (const auto& ch : input)
    {
        // Toggle the quote switch
        if (ch == '"')
            quoteStarted = !quoteStarted;

        // Keep counting the characters after a starting double quote
        else if (quoteStarted)
            ++ans;
    }

    // If a closing quote was not found, it was not balanced
    if (quoteStarted) // quoteDidNotEnd
    {
        std::cout << "Error";
    }

    // Print the number of characters within all the double quotes
    else
    {
        std::cout << ans;
    }
}

Редактировать:

Если вам нужно более подробное объяснение, оно находится в комментарии JohnFilleau ниже вопроса.

1 голос
/ 01 апреля 2020

Вот рабочая версия с использованием рекурсии. Для удобства чтения я разделил его на две функции, которые рекурсивно вызывают друг друга.

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

#include <iostream>

int count_marks(const char* str, int count = 0, const char* err = nullptr);
int count_between_marks(const char* str, int count = 0, const char* err = nullptr);

int count_marks(const char* str, int count, const char* err) {
    if (!*str) {
        if (!err) {
            std::cout << "Error // No quotation marks at all\n";
            return -1;
        }

        std::cout << count << " // All quotation marks are complete\n";
        return count;
    }

    if (*str == '\"')
        return count_between_marks(str+1, count, str+1);
    else
        return count_marks(str+1, count, err);
}

int count_between_marks(const char* str, int count, const char* err) {
    if (!*str) {
        std::cout << "Error // No quotation marks after " << err << '\n';
        return -1;
    }
    if (*str == '\"')
        return count_marks(str+1, count, err);
    else
        return count_between_marks(str+1, count+1, err);
}

int main() {
    std::string s("\"Hello World\", \"Some\"");

    std::string s2("\"Hello World\", \"Some");

    std::string s3("Hello World, Some");

    count_marks(s.c_str());
    count_marks(s2.c_str());
    count_marks(s3.c_str());
}
1 голос
/ 01 апреля 2020

Вы можете использовать что-то простое, например, найти позиции двойных кавычек и вычесть их.

static const std::string example = "The \"comment\" is quoted.";
const std::string::size_type first_position = example.find('"');
const std::string::size_type second_position = example.find('"', second_position + 1);
const unsigned int character_quantity = second_position - first_position;

Существуют проблемы с приведенным выше кодом, такие как проверка наличия двойных кавычек, которую должен реализовать OP.

Это одна из многих возможных реализаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...