C code shows error "Targeting failed (recorded core image)" error

0

The code compiles and runs normally up to the "switch" statement.

#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;

}
    
asked by anonymous 16.10.2017 / 19:13

1 answer

1

Do not ignore the warnings of the compiler!

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

The variable escolha has not been initialized, making the content of it undetermined. By passing it as a parameter to the scanf() function, the compiler understood that this undetermined content was an address in memory, and attempted to write to that position the input read from the keyboard, causing segmentation to fail. >

Replace:

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

By:

scanf("%d", &escolha);

Here is a tested code with the correct 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;
}
    
16.10.2017 / 19:24