Code in C displays error "Segmentation failure (recorded core image)"

Asked

Viewed 319 times

0

Code compiles and runs normally until "switch".

#include <stdio.h>

int main(){
    float mg, sp, rj, ms, produto;
    int escolha;

    printf("Digite o preço do produto: ");
    scanf("%f", &produto);

    // Impostos dos produtos nos respectivos estados
    mg = (produto * 7) / 100;
    sp = (produto * 12) / 100;
    rj = (produto * 15) / 100;
    ms = (produto * 8) / 100;

    printf("Escolha o estado de destino: \n1.Minas Gerais\n2.São 
        Paulo\n3.Rio de Janeiro\n4.Mato Grosso do Sul\n");

    scanf("%d", escolha);

    switch (escolha) {
        case '1':
            printf("Preço final do produto: %f", mg);
            break;
        case '2':
            printf("Preço final do produto: %f", sp);
            break;
        case '3':
            printf("Preço final do produto: %f", rj);
            break;
        case '4':
            printf("Preço final do produto: %f", ms);
            break;
        default:
            printf("Digite um Estado válido!!!\n");
    }

    return 0;

}
  • A detail that @Lacobus corrected, but I don’t remember him specifying it in his reply, because it is very detailed. The condition of his case is a character-type constant, such as case '1'. It will only be directed to this case when the entered value is 49. ASCII magic, the character '1' is a constant number in the case of 49, as well as 'a' would be 97

1 answer

1


Don’t ignore the warnings compiler!

Certainly, when compiling the question code, the compiler issued a Warning warning that the second parameter of scanf() is not compatible with the conversion specifier %d, waiting for a guy int* (pointer to integer) as argument.

The variable escolha has not been initialized, causing its contents to be undetermined. By passing it as a parameter to the function scanf(), the compiler understood that this undetermined content was an address in memory, and tried to record at this position the input read from the keyboard, causing the segmentation failure.

Substitute:

scanf("%d", escolha); /* WARNING! */

For:

scanf("%d", &escolha);

Follow a code tested with proper fixes and improvements:

#include <stdio.h>

int main( void )
{
    float preco, produto, imposto;
    int escolha;

    printf("Digite o preço do produto: ");
    scanf("%f", &produto);

    printf("Escolha o estado de destino: \n1.Minas Gerais\n2.Sao Paulo\n3.Rio de Janeiro\n4.Mato Grosso do Sul\n");
    scanf("%d", &escolha);

    switch (escolha) {
        case 1: imposto = 7.0; break;
        case 2: imposto = 12.0; break;
        case 3: imposto = 15.0; break;
        case 4: imposto = 8.0; break;
        default: printf("Digite um estado valido!\n"); return 1;
    }

    preco = (produto * imposto) / 100.0;

    printf("Preço final do produto: R$%.02f\n", preco );

    return 0;
}
  • Much better, but I also needed the final price to be the product plus tax, but solved the problem, thank you very much.

  • I missed the explanation of the mistake

  • 1

    @Jeffersonquesado: Feito!

Browser other questions tagged

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