cin.get(a, 256);
for(int i = 0; i < strlen(a); i++){
    if(strchr("aeiou", a[i])){
        s = 0;
        strcpy(substr, empty);
        isubstr = 0;
    }
    
    else{
        s++;
        substr[isubstr++] = a[i];
    
        if(s > maax || s == maax){
            maax = s;
            memset(show, 0, 256);
            strcpy(show, substr);
        }

    }
    
}
cout << show;

Ceci est le code. Il a l'intention de trouver la plus longue sous-chaîne avec seulement des consonnes et s'il y en a 2+ avec la même longueur, il sort la plus éloignée (plus proche de la droite)

Considérez la séquence suivante:

jfoapwjfppawefjdsjkflwea

Séparé par des voyelles, cela ressemblerait à ceci:

jf |oa| pwjfpp |a| w |e| fjdsjkflw |ea|

Remarquez comment "fjdsjkflw" est la plus grande sous-chaîne sans voyelle. Ce code produit juste cela, y compris des nombres aléatoires à la fin:

fjdsjkflwê²a

Pourquoi cela arrive-t-il? Pourquoi met-il NULL 3 caractères au-delà de ce à quoi il est destiné?

1
Just Dragos 13 mars 2021 à 00:57

1 réponse

Meilleure réponse

Pour commencer, vous devez écrire une fonction qui trouve une séquence de consonnes aussi longue.

Vous avez fourni un code incomplet, il est donc difficile de l'analyser. Par exemple, on ne voit pas où et comment les variables substr et empty utilisées dans cet appel

strcpy(substr, empty);

Sont définis et quelles sont leurs significations.

Il y a aussi des déclarations comme celle-ci

memset(show, 0, 256);

Cela n'a pas de sens car par exemple après cette déclaration il y a la déclaration

strcpy(show, substr);

La déclaration précédente est donc tout simplement redondante.

Ou par exemple, il semble qu'une de ces variables s et isubstr soit également redondante.

Je peux proposer la solution suivante implémentée en fonction.

#include <iostream>
#include <utility>
#include <cstring>

std::pair<const char *, size_t> max_consonant_seq( const char *s )
{
    const char *vowels = "aeiouAEIOU";
    
    std::pair<const char *, size_t> p( nullptr, 0 );
    
    do
    {
        size_t n = std::strcspn( s, vowels );
        
        if ( n != 0 && !( n < p.second ) )
        {
            p.first = s;
            p.second = n;
        }
        
        s += n;
        
        s += std::strspn( s, vowels );
    } while ( *s );

    return p;
}

int main() 
{
    const char *s = "jfoapwjfppawefjdsjkflwea";
    
    auto p = max_consonant_seq( s );
    
    if ( p.second ) std::cout.write( p.first, p.second ) << '\n';
    
    return 0;
}

La sortie du programme est

fjdsjkflw

La fonction renvoie une paire d'objets. Le premier spécifie le pointeur de départ de la séquence maximale de consonnes dans la chaîne passée et le second objet spécifie la longueur de la séquence.

Tout ce dont vous avez besoin pour comprendre le fonctionnement de la fonction est de lire la description des deux fonctions de chaîne C strspn et strcspn.

3
Vlad from Moscow 12 mars 2021 à 22:52