PDA

Visualizza la versione completa : [C] Funzione scanf() e stringhe


dieghito4
21-08-2011, 17:21
Ciao,
devo fare un progettino e sto rinfrescando il mio C, non senza problemi!
Il problema nel codice dell'esercizietto sotto e che mi da un segmentation fault dopo la terza scanf!le ho provate tutte ma niente...



#include <stdio.h>
#include <stdlib.h>

void scelta_operazione(char *operazione, int a, int b);


int main(void){


int a = 0;
int b = 0;

char *op = NULL;

printf("Inserisci due numeri interi!\n");

printf("a = ");
scanf("%d", &a);

printf("b = ");
scanf("%d", &b);

printf("Inserisci l'operazione da effettuare:");
scanf("%s", op);

scelta_operazione(op, a , b);

return 0;
}

void scelta_operazione(char *operazione, int a, int b){

int scelta = 0;
char *somma = "somma";
char *prodotto = "prodotto";
char *differenza = "differenza";

if( strcmp( operazione , somma ) == 0 )scelta = 1;
if( strcmp( operazione , prodotto ) == 0 )scelta = 2;
if( strcmp( operazione , differenza ) == 0 )scelta = 3;
else return;

switch(scelta){

case 1:

printf("L'operazione da te scelta la somma.\n Il risultato a+b = %d ", a + b);
break;

case 2:

printf("L'operazione da te scelta il prodotto.\n Il risultato a*b = %d ", a * b);
break;

case 3:

printf("L'operazione da te scelta la differenza.\n Il risultato a-b = %d ", a - b);
break;

default:

printf("ERRORE: Operazione non disponibile!");
break;
}
}


Sto usando gcc su Ubuntu 9.10 se pu essere di aiuto!

Grazie dell'attenzione!:D

MItaly
21-08-2011, 17:28
Stai passando alla scanf un puntatore a NULL... come fa la scanf a memorizzare i caratteri che vengono inseriti? Devi passarle un buffer di dimensioni adeguate.

dieghito4
21-08-2011, 17:54
Quindi allocargli memoria con una malloc?

MItaly
21-08-2011, 17:58
Pu bastare anche solo un array di char allocato sullo stack.


char buffer[100];

Occhio per che per evitare problemi di buffer overflow a quel punto dovrai fare


scanf("%99s",buffer);

in modo che la scanf non sfori dal buffer se l'utente inserisce pi di 99 caratteri. In alternativa, la fgets rende la "messa in sicurezza" pi semplice:


fgets(buffer, sizeof(buffer), stdin);

dieghito4
21-08-2011, 18:20
ok grazie mille!:D

cmq tanto per la cronaca ho provato anche la malloc e funziona:


op = (char*) malloc( 256 * sizeof(char));

ho aggiunto questo pezzo di codice prima della scanf, anche se non molto efficiente per la memoria.

Ciao.

Freax
21-08-2011, 21:04
occhio che fgets ti fa in automatico un -1 sulla dimensione del buffer, cio sul risultato di sizeof, abituati ad usare pure fgets() ma ricorda sempre che concettualmente ci vuole sempre 1 carattere riservato per il "tappo" che \0

MItaly
21-08-2011, 21:12
Originariamente inviato da Freax
occhio che fgets ti fa in automatico un -1 sulla dimensione del buffer, cio sul risultato di sizeof, abituati ad usare pure fgets() ma ricorda sempre che concettualmente ci vuole sempre 1 carattere riservato per il "tappo" che \0
In altre parole: ad fgets passi il numero massimo di caratteri da scrivere nel buffer incluso il carattere di fine stringa; per questo ci si pu passare il risultato di sizeof inalterato.

Nota che nella malloc sizeof(char) inutile, dato che sizeof misura le dimensioni degli oggetti in char, e quindi sizeof(char) sempre e comunque 1 su qualunque piattaforma.

Loading