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;

Este es el código. Tiene la intención de encontrar la subcadena más larga con solo consonantes y si hay 2+ con la misma longitud, genera la más lejana (más cercana a la derecha).

Considere la siguiente secuencia:

jfoapwjfppawefjdsjkflwea

Dividido por vocales, se vería así:

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

Observe cómo "fjdsjkflw" es la subcadena más grande sin vocal. Este código genera solo eso, incluidos algunos números aleatorios al final:

fjdsjkflwê²a

¿Por qué pasó esto? ¿Por qué pone NULL 3 caracteres más allá de lo previsto?

1
Just Dragos 13 mar. 2021 a las 00:57

1 respuesta

La mejor respuesta

Para empezar, debes escribir una función que encuentre una secuencia de consonantes tan larga.

Proporcionó un código incompleto, por lo que es difícil analizarlo. Por ejemplo, no se ve dónde y cómo se usan las variables substr y empty en esta llamada.

strcpy(substr, empty);

Están definidos y cuáles son sus significados.

También hay declaraciones como esta

memset(show, 0, 256);

Que no tienen sentido porque, por ejemplo, después de esta declaración está la declaración

strcpy(show, substr);

Entonces, la declaración anterior es simplemente redundante.

O, por ejemplo, parece que una de estas variables s y isubstr también es redundante.

Puedo sugerir la siguiente solución implementada como función.

#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 salida del programa es

fjdsjkflw

La función devuelve un par de objetos. El primero especifica el puntero inicial de la secuencia máxima de consonantes en la cadena pasada y el segundo objeto especifica la longitud de la secuencia.

Todo lo que necesita para comprender cómo funciona la función es leer la descripción de las dos funciones de cadena C strspn y strcspn.

3
Vlad from Moscow 12 mar. 2021 a las 22:52