Remove and re-insert vowels in any sentence, C

4

Context: I am trying to develop a code that is able to remove all the aeiou vowels from any phrase and save the position that was the vowel in the sentence so that it is possible to reconstruct the phrase again using what was saved as a hypothetical example of " compression / decompression. "

Problem: The part of removing the vowels is ok, but to put them back is presenting problem with certain words.

Simple words like macaco remove the vowels and replace them normally, but words like papaia , which have vowels in a row, it returns 'potato', which runs out of the necessary.

An example of proper operation:

Digite uma frase simples para compressão:warning: this program uses gets(), which is unsafe.
macaco
---------- RESULTADO DA COMPRESSÃO ----------
Sua mensagem comprimida é: mcc
Sua mensagem comprimida tem length: 3

Sua mensagem descomprimida é: [m][a][c][a][c][o]
Sua mensagem descomprimida tem length: 7

A compressão poupou: -1
-------------------------------------------
Program ended with exit code: 0

Example of the problem mentioned:

Digite uma frase simples para compressão:warning: this program uses gets(), which is unsafe.
papaia
---------- RESULTADO DA COMPRESSÃO ----------
Sua mensagem comprimida é: pp
Sua mensagem comprimida tem length: 2

Sua mensagem descomprimida é: [p][a][p][a]
Sua mensagem descomprimida tem length: 7

A compressão poupou: -1
-------------------------------------------
Program ended with exit code: 0

Code:

char vogaisEncontrada[100];

int main()
{
    char fraseOriginal[100],
         fraseCompactada[100],
         fraseDescompactada[100];

    int fraseOriginalLen,
        fraseFinalLen;

    printf("Digite uma frase simples para compressão:");

    gets(fraseOriginal);

    fraseOriginalLen = strlen(fraseOriginal);

    printf("---------- RESULTADO DA COMPRESSÃO ----------");

    // COMPACTA //

    int c,
        cV = 0;

    for(c = 0; c <= fraseOriginalLen; c++) {
        if(fraseOriginal[c] == 'a') {
            vogaisEncontrada[c - cV] = 'a';

            cV++;
        } else if(fraseOriginal[c] == 'e') {
            vogaisEncontrada[c - cV] = 'e';

            cV++;
        } else if(fraseOriginal[c] == 'i') {
            vogaisEncontrada[c - cV] = 'i';

            cV++;
        } else if(fraseOriginal[c] == 'o') {
            vogaisEncontrada[c - cV] = 'o';

            cV++;
        } else if(fraseOriginal[c] == 'u') {
            vogaisEncontrada[c - cV] = 'u';

            cV++;
        } else if(strlen(&fraseOriginal[c]) > 0) {
            vogaisEncontrada[c] = ' ';

            fraseCompactada[c - cV] = fraseOriginal[c];
         }
    }

    // COMPACTA //

    printf("\nSua mensagem comprimida é: %s", fraseCompactada);

    fraseFinalLen = strlen(fraseCompactada);
    printf("\nSua mensagem comprimida tem length: %d", fraseFinalLen);


    printf("\n\nSua mensagem descomprimida é: %s", fraseDescompactada);

    // DESCOMPACTA //

    int c1;

    for(c1 = 0; c1 <= fraseOriginalLen; c1++) {
        if((vogaisEncontrada[c1] == ' ') && (strlen(&fraseCompactada[c1]) > 0)) {
            printf("%c", fraseCompactada[c1]);
        } else if((strlen(&fraseCompactada[c1]) == 0) && (strlen(&vogaisEncontrada[c1]) > 0) && !(vogaisEncontrada[c1] == ' ')) {
            printf("%c", vogaisEncontrada[c1]);
        } else if((strlen(&fraseCompactada[c1]) > 0) && !(vogaisEncontrada[c1] == ' ')) {
            printf("%c", vogaisEncontrada[c1]);
            printf("%c", fraseCompactada[c1]);
        }
    }

    // DESCOMPACTA //

    fraseFinalLen = c1;
    printf("\nSua mensagem descomprimida tem length: %d\n", fraseFinalLen);

    printf("\nA compressão poupou: %d\n", (fraseOriginalLen - fraseFinalLen));

    printf("-------------------------------------------\n");

    return 0;
}
    
asked by anonymous 18.06.2017 / 17:18

1 answer

3

I looked at your code, unfortunately I could not understand it and fixed it, but I noticed the following:

  • for(c = 0; c <= fraseOriginalLen; c++) - if you have 6 positions in the vector, you go from 0 to 5, then the correct one is < .
  • vogaisEncontrada[c - cV] - When you use c - cV in a word with vowels in a row, every iteration of the loop will always change the same position, so you end up losing vowels.
  • I know the intent is to do something similar to compressing / decompressing, but from what I can understand from your code (I may be wrong), you compact in one way and try to unpack from another.
  • for(c1 = 0; c1 <= fraseOriginalLen; c1++) - same thing as item 1.
  • I tried to write a clearer code, see if it helps:

    #include <stdio.h>
    #include <string.h>
    
    // exibição da acentuação no console
    #include <locale.h>
    
    #define TAMANHO_VETOR 100
    
    char vogaisEncontrada[TAMANHO_VETOR];
    
    int main()
    {
        // exibição da acentuação no console
        setlocale(LC_ALL, "Portuguese");
    
        // inicialização dos vetores para limpeza de sujeira
        char fraseOriginal[TAMANHO_VETOR] = { 0 },
             fraseCompactada[TAMANHO_VETOR] = { 0 },
             fraseDescompactada[TAMANHO_VETOR] = { 0 };
    
        int fraseOriginalLen,
            fraseFinalLen;
    
        printf("Digite uma frase simples para compressão:");
    
        // pelo que li em comentários, o gets não é recomendado
        fgets(fraseOriginal, TAMANHO_VETOR, stdin);
    
        // o fgets considera a quebra de linha, por isso fiz -1
        fraseOriginalLen = strlen(fraseOriginal) - 1;
    
        printf("---------- RESULTADO DA COMPRESSÃO ----------");
    
        // COMPACTA //
    
        int c,
            cV = 0;
    
        for (c = 0; c < fraseOriginalLen; c++) {
            // strchr procura um char em um string, 
            // retornando um cursor com a posição ou 
            // NULL caso não encontre
            if (strchr("aeiou", fraseOriginal[c]) != NULL) {
                vogaisEncontrada[c] = fraseOriginal[c];
                cV++;
            } else {
                vogaisEncontrada[c] = ' ';
                fraseCompactada[c - cV] = fraseOriginal[c];
            }
        }
    
        printf("\nSua mensagem comprimida é: %s", fraseCompactada);
    
        printf("\nSua mensagem comprimida tem length: %d", strlen(fraseCompactada));
    
    
        // DESCOMPACTA //
    
        int c1,
            // posição da consoante
            pC = 0;
    
        for (c1 = 0; c1 < fraseOriginalLen; c1++) {
            if (vogaisEncontrada[c1] == ' ') {
                fraseDescompactada[c1] = fraseCompactada[pC];
                pC++;
            }
            else {
                fraseDescompactada[c1] = vogaisEncontrada[c1];
            }
        }
    
        printf("\n\nSua mensagem descomprimida é: %s", fraseDescompactada);
    
        printf("\nSua mensagem descomprimida tem length: %d\n", strlen(fraseDescompactada));
    
        fraseFinalLen = strlen(fraseCompactada);
        printf("\nA compressão poupou: %d\n", (fraseOriginalLen - fraseFinalLen));
    
        printf("-------------------------------------------\n");
    
        return 0;
    }
    
        
    19.06.2017 / 01:59