Loop problem with switch case

1

I have refactored the code following the guidelines given here. However, I have the initial problem again ... I choose the desired option, it performs the desired action but then goes to the default case switch and prints "invalid information"

My code looks like this:

#include <string.h>
#include <stdio.h>
#define TAM 20
#include <ctype.h>

int menu(){
    char opc;

    printf("| A | Ler string\n");
    printf("| B | Tamanho da string1\n");
    printf("| C | Comparar strings\n");
    printf("| D | Concatenar strings\n");
    printf("| E | Imprimir string1 invertida\n");
    printf("| F | Quantidade de ocorrencias de um caractere na string1\n");
    printf("| G | Subsituir o primeiro caractere1 pelo caractere2\n");
    printf("| H | Retornar substring da string1\n");
    printf("| I | Sair\n");
    scanf("%c", &opc);

    return tolower(opc);
}


void pedirstr1(char *str1){

        printf("Entre com a string1: ");
        fflush(stdin);
        fgets(str1, TAM, stdin);
        str1[strlen(str1)-1] = '
#include <string.h>
#include <stdio.h>
#define TAM 20
#include <ctype.h>

int menu(){
    char opc;

    printf("| A | Ler string\n");
    printf("| B | Tamanho da string1\n");
    printf("| C | Comparar strings\n");
    printf("| D | Concatenar strings\n");
    printf("| E | Imprimir string1 invertida\n");
    printf("| F | Quantidade de ocorrencias de um caractere na string1\n");
    printf("| G | Subsituir o primeiro caractere1 pelo caractere2\n");
    printf("| H | Retornar substring da string1\n");
    printf("| I | Sair\n");
    scanf("%c", &opc);

    return tolower(opc);
}


void pedirstr1(char *str1){

        printf("Entre com a string1: ");
        fflush(stdin);
        fgets(str1, TAM, stdin);
        str1[strlen(str1)-1] = '%pre%';
}

void pedirstr2(char *str2){

        printf("Entre com a string1: ");
        fflush(stdin);
        fgets(str2, TAM, stdin);
        str2[strlen(str2)-1] = '%pre%';
}


int main(){
    char str1[TAM] = " NULL ", str2[TAM] = " NULL ", char1, char2, c, opc = 'f', sair=0, c2, junto[TAM];
    int inicio, fim, contchar = 0;


    do {
        opc = menu();
        printf("\n\n");

        switch(opc){

        case 'a':
                //system("CLS");

                pedirstr1(str1);

                break;

        case 'b':
                //system("CLS");

                if (strcmp(str1, " NULL ") == 0){
                    printf("Nao existe nenhum valor na string1.\n");
                    printf("\n\n");
                } else {
                    printf("O tamanho da string1 e: %d\n", strlen(str1));
                    printf("\n\n");
                }

                break;

        case 'c':
                //system("CLS");

                pedirstr1(str1);
                pedirstr2(str2);

                if (strcmpi(str1, str2) == 0){
                    printf("As strings 1 e 2 sao iguais.\n");
                    printf("\n\n");
                } else {
                    printf("As strings 1 e 2 sao diferentes. \n");
                    printf("\n\n");
                }

                break;

        case 'd':
                //system("CLS");

                pedirstr1(str1);

                pedirstr2(str2);

                printf("string1 + string2 = %s%s\n", str1, str2); //posso usar strcat mas da ruim pq fica armazenado na variavel
                printf("\n\n");

                break;

        case 'e':
                //system("CLS");

                pedirstr1(str1);

                printf("String1 invertida: ");
                for (c=strlen(str1); c>=0; c--){
                    printf("%c", str1[c]);
                }

                printf("\n\n");

                break;

        case 'f':
                //system("CLS");

                pedirstr1(str1);

                printf("Letra que deseja contar: ");
                scanf("%c", &char1);

                for (c=0; c<strlen(str1); c++){
                    if (str1[c] == char1){
                        contchar ++;
                    }
                }

                printf("A letra %c aparece %d vezes na string1.\n", char1, contchar);
                printf("\n\n");

                break;

        case 'g':
                //system("CLS");

                pedirstr1(str1);

                printf("Entre com o caractere que deseja substituir: [diferencie maiusculas de minusculas]");
                scanf("%c", &char1);

                printf("Qual caractere deseja colocar no lugar? ");
                scanf("%c", &char2);

                for (c=0; c<strlen(str1); c++){
                    if (str1[c] == char1){
                        str1[c] = char2;
                    }
                }

                printf("Nova string: %s", str1);
                printf("\n\n");

                break;

        case 'h':
                //system("CLS");

                pedirstr1(str1);

                printf("A partir de qual posicao? ");
                scanf("%d", &inicio);

                printf("Até onde? ");
                scanf("%d", &fim);

                while (inicio > fim){
                    printf("A posicao de inicio deve ser menor do que a do fim. \n");

                    printf("A partir de qual posicao? ");
                    scanf("%d", &inicio);

                    printf("Ate onde? ");
                    scanf("%d", &fim);
                }

                printf("Substring: ");
                for (c=inicio; c<fim; c++){
                    printf("%c", str1[c]);
                }

                printf("\n\n");

                break;
        case 'i':
                sair = 1;

                break;

        default:
                //system("CLS");

                printf("Informacao invalida, tente novamente. \n");
                printf("\n\n");

                break;
        }
    } while (!sair);

    return 0;
}
'; } void pedirstr2(char *str2){ printf("Entre com a string1: "); fflush(stdin); fgets(str2, TAM, stdin); str2[strlen(str2)-1] = '%pre%'; } int main(){ char str1[TAM] = " NULL ", str2[TAM] = " NULL ", char1, char2, c, opc = 'f', sair=0, c2, junto[TAM]; int inicio, fim, contchar = 0; do { opc = menu(); printf("\n\n"); switch(opc){ case 'a': //system("CLS"); pedirstr1(str1); break; case 'b': //system("CLS"); if (strcmp(str1, " NULL ") == 0){ printf("Nao existe nenhum valor na string1.\n"); printf("\n\n"); } else { printf("O tamanho da string1 e: %d\n", strlen(str1)); printf("\n\n"); } break; case 'c': //system("CLS"); pedirstr1(str1); pedirstr2(str2); if (strcmpi(str1, str2) == 0){ printf("As strings 1 e 2 sao iguais.\n"); printf("\n\n"); } else { printf("As strings 1 e 2 sao diferentes. \n"); printf("\n\n"); } break; case 'd': //system("CLS"); pedirstr1(str1); pedirstr2(str2); printf("string1 + string2 = %s%s\n", str1, str2); //posso usar strcat mas da ruim pq fica armazenado na variavel printf("\n\n"); break; case 'e': //system("CLS"); pedirstr1(str1); printf("String1 invertida: "); for (c=strlen(str1); c>=0; c--){ printf("%c", str1[c]); } printf("\n\n"); break; case 'f': //system("CLS"); pedirstr1(str1); printf("Letra que deseja contar: "); scanf("%c", &char1); for (c=0; c<strlen(str1); c++){ if (str1[c] == char1){ contchar ++; } } printf("A letra %c aparece %d vezes na string1.\n", char1, contchar); printf("\n\n"); break; case 'g': //system("CLS"); pedirstr1(str1); printf("Entre com o caractere que deseja substituir: [diferencie maiusculas de minusculas]"); scanf("%c", &char1); printf("Qual caractere deseja colocar no lugar? "); scanf("%c", &char2); for (c=0; c<strlen(str1); c++){ if (str1[c] == char1){ str1[c] = char2; } } printf("Nova string: %s", str1); printf("\n\n"); break; case 'h': //system("CLS"); pedirstr1(str1); printf("A partir de qual posicao? "); scanf("%d", &inicio); printf("Até onde? "); scanf("%d", &fim); while (inicio > fim){ printf("A posicao de inicio deve ser menor do que a do fim. \n"); printf("A partir de qual posicao? "); scanf("%d", &inicio); printf("Ate onde? "); scanf("%d", &fim); } printf("Substring: "); for (c=inicio; c<fim; c++){ printf("%c", str1[c]); } printf("\n\n"); break; case 'i': sair = 1; break; default: //system("CLS"); printf("Informacao invalida, tente novamente. \n"); printf("\n\n"); break; } } while (!sair); return 0; }
    
asked by anonymous 24.07.2018 / 18:07

2 answers

2

You have opc = menu(); out of your do while . In other words, your opc variable does not update after each cycle is always the same and keeps the 1st value entered.

Expression:

do {
    opc = menu();
    switch(opc){

    //resto do codigo

    }
} while (!sair);
    
24.07.2018 / 18:21
2

Add

getchar();

After

scanf("%c", &opc);

When you choose a non-read option and the ENTER key. It performs the operation you chose and understands the ENTER you gave as an option you typed too, so it goes into default.

    
25.07.2018 / 17:00