Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [C]Problema con scanf e stringhe

    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...

    codice:
    #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!

  2. #2
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Quindi allocargli memoria con una malloc?

  4. #4
    Può bastare anche solo un array di char allocato sullo stack.
    codice:
    char buffer[100];
    Occhio però che per evitare problemi di buffer overflow a quel punto dovrai fare
    codice:
    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:
    codice:
    fgets(buffer, sizeof(buffer), stdin);
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    ok grazie mille!

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

    codice:
    op = (char*) malloc( 256 * sizeof(char));
    ho aggiunto questo pezzo di codice prima della scanf, anche se non è molto efficiente per la memoria.

    Ciao.

  6. #6
    Utente di HTML.it L'avatar di Freax
    Registrato dal
    Jul 2006
    Messaggi
    460
    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

  7. #7
    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.
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.