Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    17

    C - leggere una stringa di lunghezza indefinita da stdin

    Ciao ragazzi, dovrei leggere una stringa di lunghezza indefinita da stdin e salvarla in un'array.


    Ho dichiarato l'array usando "malloc" per allocare una quantità di memoria iniziale e vorrey usare la funzione "realloc" per poter riallocare la memoria nel caso in cui la lunghezza dichiarata inizialmente non dovesse bastare.

    Per la lettura dei caratteri ho usato la funzione "getchar" all'interno di un ciclo while, nel quale controllo la lunghezza raggiunta dalla stringa per mezzo di un contatore e, nel caso in cui la lunghezza raggiunta supera quella dichiarata richiamo la realloc ma così come è il codice ora non funzione e mi ritorna un errore.

    Ho fatto deverse prove ma nessun miglioramento.

    Qualcuno sa aiutarmi?

  2. #2
    Posta il codice che hai scritto.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    17

    Codice

    void get_string()
    {

    int i = 0;
    char *word = malloc(sizeof(char) * 4);


    printf ("Scrivi la parola:\n");

    do
    {
    word[i] = getchar();
    i++;
    if ((i % 4) == 0)
    {
    if (!(realloc (word, sizeof(char) * 4)))
    {
    printf("Errore nella riallocazione della memoria. Il programma sarà chiuso.");
    }
    }

    } while (word[i-1] != '\n');

    word[i] = '\0';


    printf("\n%i\n%s\n\n",i,word);


    }

  4. #4
    codice:
    realloc (word, sizeof(char) * 4)
    Qui stai riallocando la stessa quantità di memoria che era già allocata, mentre devi ovviamente allocarne di più.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    (doppio)
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    17

    errore

    Ho provato a raddoppiare il numero ma mi restiturisce sempre lo stesso errore.

    *** glibc detected *** c_prog/pe/prog_estivo_00/ordina: double free or corruption (fasttop): 0x0915c038 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6[0xb7f29454]
    /lib/tls/i686/cmov/libc.so.6(cfree+0x96)[0xb7f2b4b6]
    c_prog/pe/prog_estivo_00/ordina[0x804857d]
    c_prog/pe/prog_estivo_00/ordina[0x8048602]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb7ed0685]
    c_prog/pe/prog_estivo_00/ordina[0x8048481]
    ...
    ...
    più una serie di riche in cui mi elenca le posizioni in cui ho salvato il sorgente.

    Ho letto da qualche parte di liberare il puntatore prima di riallocare la memoria con (free) ma l'errore è sempre questo.

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ma il codice completo di main qual e'? (Usa i tag code altrimenti si fa fatica a comprenderlo e a risponderti)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    17
    Questa è la main:

    codice:
    int main ()
    {
    
    	char 	*word1 = malloc(sizeof(char) * 15),
    			*word2 = malloc(sizeof(char) * 15);
    
    	get_string();
    
    
    	return (0);
    }
    Questa è la funzione che vorrei usare per leggere la stringa:

    codice:
    void get_string()
    {
    
    	int i = 0;		/* Indice ciclo for */
    	char *word = malloc(sizeof(char) * 4);
    
    
    	printf ("Scrivi la parola:\n");
    
    	do
    	{
    		word[i] = getchar();
    		i++;
    		if ((i % 4) == 0)
    		{
    			if (!(realloc (word, sizeof(char) * 8))) /* dopo suggerimento di MItaly */
    			{
    				printf("Errore nella riallocazione della memoria. Il programma sarà chiuso.");
    			}
    		}
    		
    	} while (word[i-1] != '\n');
    
    	word[i] = '\0';
    
    
    	printf("\n%i\n%s\n\n",i,word);
    }
    Ps. Grazie per la dritta sul codice!!

  9. #9
    Il punto è che devi aumentare ad ogni iterazione la quantità di memoria allocata; ecco una mia soluzione (che evita la getchar in favore della fgets):
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    char * GetLine(FILE * File);
    
    int main(void)
    {
        char * stringa;
        stringa = GetLine(stdin);
        printf("Hai digitato: %s\n",stringa);
        free(stringa);
        return 0;
    }
    
    char * GetLine(FILE * File)
    {
        const size_t blockSize=128;
        size_t actualSize = blockSize;
        char * ret = NULL;
        for(;;)
        {
            ret = realloc(ret, actualSize);
            fgets(ret+actualSize-blockSize, blockSize+1, File);
            if(ret[strlen(ret)-1]=='\n')
                break;
            actualSize+=blockSize;
        }
        return ret;
    }
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ame sembra che la realloc debba essere scritta cosi'

    if (!(word = (char *)realloc (word, sizeof(char) * (i+4))))

    E la word1 e word2 non sembrano essere utilizzate ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

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.