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

    [C] Buffer "intasato" ?

    Ciao a tutti!

    Per risolvere un determinato problema ho scritto la seguente funzione:

    codice:
    #include <stdio.h> 
    #include <stdlib.h>
    #include <string.h>
    #include <conio.h>   //Per getch()   
    #include <ctype.h>
    
    void charcoun(char *, int , int , int );
    void message(int );
    int Bkspace(char *, int, int );
    void read(int , char *, int );
    
    int main(void)
    {
        char *a=NULL;  
        char *b=NULL;
        char *c=NULL;
          
        a=(char *)calloc(20, sizeof(char));
        b=(char *)calloc(30, sizeof(char));
        c=(char *)calloc(40, sizeof(char));
    
        message(1);
        read(20, a, 1); 
        system("cls");
            
        message(2);
        read(30, a, 2);
        system("cls");
     
        message(3);
        read(40, a, 3);
        system("cls");
        
        printf("\na: %s\n", a);
        printf("\nb: %s\n", b);
        printf("\nc: %s\n\n\n", c);
        
        system("pause");
        return 0;   
    }
    
    
    //Legge dallo standard input una striga di
    //"max" caratteri.
    
    void read(int max, char *data, int id)
    {
    	char c;
    	char *stream;             
    	int j=0, k=max;  //k=caratteri disponibili per l'input!
    
    	//Alloco lo spazio per l'input
    	stream=(char *) calloc(max, sizeof(char));
        
    	while(1) {
    		
    		c=getch();     //Legge dallo standard input un carattere  
    		stream[j]=c; 
    		putch(c);
    
    		//Se l'utente preme invio termina la fase di input.
    
    		if(c==13) {                
    			stream[j]='\0';
    			strcpy(data, stream);
    			return;
    		}
    
            //Alla pressione di BACKSPACE occorre cancellare 
    	//l'ultimo carattere inserito!
          
            if(c==8) {
               
            	if(j!=0) 
    		   k++;  //incremento k!
    			
    		j=Bkspace(stream, j, id);
                    continue;
    	}    
    
    	//Se l'utente supera il numero di caratteri disponibili per l'input 
    	//il ciclo termina.
    
    		if(j==max) {
    
    			printf("\t > Errore. Puoi scrivere massimo %d caratteri!", max);
    			stream[j]='\0';
    
    			strcpy(data, stream);
    			printf("\n\n\n");
    			system("pause");
    			return;
    		}
    
    		charcoun(stream, k, max, id);  //Stampa il numero di caratteri disponibili 
    		                               //per l'input. 
    		j++;  
    		k--;
    
    	}
    }
    
    //Stampa il numero di caratteri ancora disponibile 
    //per l'input.
    
    void charcoun(char *stream, int k, int max, int id)
    {
    	int j=0;
    
    	system("cls");
            message(id);
    	
    	//Ristampa sullo standard output la stringa stream.
    
    	while((stream[j]!='\0') && (j<max)) {
    		
    		putch(stream[j]);
    		j++;
    	}
    
    	if(k>0) {
    		printf("\n\n\n\n");
    	        printf("%d caratteri rimanenti", k-1);
    	}
    }
    
    //backspace.
    
    int Bkspace(char * stream, int k, int id)
    {
        int j=0;
        
        if(k!=0) {
    	stream[k]='\0';  //Cancello l'ultimo elemento inserito;
            k--;
        }
    		
        system("cls");
    	
        //Ristampa sullo standard output la stringa stream
              
        message(id);
    
        while(j!=k) {
           putch(stream[j]); 
           j++;
       }
       return k;
    }
    
    
    //La funzione message() stampa sullo standard output il messaggio
    //corrispondente al valore contenuto nella variabile id.
    
    void message(int id) 
    {
    	switch(id) {
    
    	      case 1: printf("Inserire il soggetto > ");  
    		      break;
    
    	      case 2: printf("Inserire commento > ");
    		      break;
    
    	      case 3: printf("Inserire scadenza [gg/mm/aaaa] > ");
    		      break;
    	}
    }
    La funzione read(...) in particolare legge dallo standard input una stringa sfruttando la funzione di libreria getch!
    Provando la funzione (ho postato anche il main da me utilizzato per testarla) però ho notato che porta a termine SOLO il primo input. Come mai? Il problema dovrebbe esser dovuto alla funzione getch() da me utilizzata ma non capisco il perchè .
    Qualche suggerimento? PLZ!


  2. #2
    Proprio nessuna idea ?!

  3. #3
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    Originariamente inviato da Fla@sh_b
    Proprio nessuna idea ?!
    ehm.... quando saprai l'errore su cui hai sbattuto la testa per giorni butterai tutto all'aria credo...

    hai fatto un banale errore passando sempre 'a' alla funzione read

    codice:
     message(1);
        read(20, a, 1); 
        system("cls");
            
        message(2);
        read(30, b, 2);
        system("cls");
     
        message(3);
        read(40, c, 3);
        system("cls");
    così a me funzia

    cmq non ti preoccupare, ho fatto errori peggiori, ho perso giorni per far funzionare un programma quando mi sono accorto che avevo commentato la chiamata ad alcune funzioni per il debug

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  4. #4
    Ciao! Grazie dell'aiuto netarrow !
    Se penso a quanto tempo ho perso per un errore così stupido...mi mangio le mani!

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.