Je veux trouver le nombre de caractères à l'intérieur d'un guillemet double.

Par exemple :

Cas 1

"Hello World", "Certains

Sortie: Erreur // guillemets manquants après Certains

Cas 2

"Bonjour Word", "Certains"

Output: 14 // Tous les guillemets sont complets

J'ai écrit le programme pour compter le nombre total de caractères, l'index du premier guillemet et le nombre total de guillemets en utilisant la récursivité.

Quelle approche dois-je utiliser pour résoudre ce problème?

0
Param Khurana 1 avril 2020 à 20:58

3 réponses

Meilleure réponse

Voici une version de travail utilisant la récursivité. Pour plus de lisibilité, je l'ai divisé en deux fonctions qui s'appellent de manière récursive.

J'utilise un pointeur vers le caractère après le dernier guillemet pour garder une trace de ce qu'il faut imprimer si le nombre de marques ne correspond pas, et en même temps l'initialiser à nullptr afin qu'il garde également une trace de si nous avons rencontré des guillemets.

#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
super 1 avril 2020 à 19:22

Vous pouvez utiliser quelque chose de simple comme trouver les positions des guillemets doubles et les soustraire.

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;

Il y a des problèmes avec le code ci-dessus, comme vérifier si les guillemets existent, que l'OP devrait implémenter.

C'est l'une des nombreuses implémentations possibles.

1
Thomas Matthews 1 avril 2020 à 18:36

S'il vous plaît, aidez-moi à comprendre quelle approche dois-je utiliser pour résoudre le problème ci-dessus.

Au lieu d'utiliser la récursivité, vous pouvez utiliser cette approche plus simple qui s'exécute en temps linéaire:

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

Modifier:

Si vous avez besoin d'une meilleure explication, c'est dans le commentaire de JohnFilleau sous la question.

2
Ardent Coder 2 avril 2020 à 02:25