Remove and replace vowels in any sentence, C

Asked

Viewed 1,394 times

4

Context: I’m trying to develop a code that will be able to remove all vowels aeiou of any sentence and save the position that the vowel was 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 vowels is ok, but to put them back is presenting problem with certain words.

Simpler words like macaco remove vowels and replace them normally, but words like papaia, that have vowels followed, it returns 'pope', which runs away from the necessary.

An example of proper functioning:

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 mentioned problem:

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;
}
  • I believe that the easiest way to solve it is to have two vectors, one of vowels and the other containing the index of these vowels in the original word.

  • @merchant at first I tried this way however I could not assemble the phrase again, because I could not unite the two vectors, in C is more complicated in my current conjuncture..

1 answer

3


I analyzed your code, unfortunately I could not understand it and fix it, but I noticed the following:

  1. for(c = 0; c <= fraseOriginalLen; c++) - if you have 6 positions in the vector, you go from 0 to 5, then the correct is <.
  2. vogaisEncontrada[c - cV] - when you use the c - cV in a word with vowels in a row, every loop iteration will always change the same position, with this you end up losing vowels.
  3. I know the intention is to do something similar to compress/unzip, but from what I understand of your code (I may be wrong), you compact one way and try to unzip another.
  4. for(c1 = 0; c1 <= fraseOriginalLen; c1++) - same thing as item 1.

I tried to write a clearer code, see if it helps you:

#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;
}
  • I think I ended up getting lost like you said, thanks for clarifying these points, really I didn’t see them. The function strchr did not know, I will read more about, an extreme thank you for your didactic.

  • I got this information debugging code line by line, I think it helps a lot! Glad I could help!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.