Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    49

    [C]stringhe di lunghezza ignota

    Ciao, come faccio a leggere da tastiera (o da file) delle stringhe di cui non conosco la lunghezza e di cui non posso nemmeno ipotizzare una lunghezza massima?
    Le stringhe contengono dei dati che dovrei passare ad altre funzioni dopo aver diviso la stringa, i vari campi sono divisi da spazi.

    Le stringhe sono formate così:

    1carattere | 1parola di 64 caratteri al massimo | 1intero(al massimo 1024) | e poi al massimo 1024 coppie formate da un float e un int, ad es:

    A nome 3 100.4 45 32.2 2 3.0 1

    usando l'intero posso sapere quante coppie ci sono successivamente, ma se se la stringa è unica come la memorizzo? se fosse su file con fgets bisogna dare una lunghezza massima, da tastiera gets richiede come parametro una stringa già allocata. Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2006
    Messaggi
    258
    potresti allocare la stringa dinamicamente invece che staticamente..

  3. #3
    non ho capito bene il tuo problema potresti spiegarti meglio, cmq sia in ogni caso se acquisire la stringa e' il tuo problema puo sempre ovviare prelevando carattere a carattere con

    car = fgetc(stdin);

    . . .spiegati meglio


    edit:

    potresti implementare il tutto attraverso una lista. . .
    Se una funzione riceve come argomento un puntatore di puntatore di puntatore quando la invochi ricordati che puo ricevere o un puntatore di puntatore di puntatore o l'indirizzo di un puntatore di puntatore

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    49
    la lista la faccio dopo per inserire le coppie dei valori, ma quello è un altro discorso..
    prima devo acquisire le stringhe che hanno una lunghezza a me sconosciuta.

    se la stringa fosse:

    A nome 800 .... dopo l'800 avrei 1600 numeri cioè le 800 coppie di float e int e non posso sapere quanto è lunga la stringa in totale.

    Potrei mettere a caso la fgets passando come secondo parametro 10000, ipotizzando di stare entro i 10000 caratteri. ipotesi che io non dovrei fare.

  5. #5
    dimmi se puo andare:

    Codice PHP:

    #include <stdio.h>
    #include <stdlib.h>
    int main(){
        
    int i=0lunghezza;
        
    char *stringatemp;
        
    stringa=(char*)malloc(sizeof(char));
        if(
    stringa!=NULLprintf("\n > memoria allocata correttamente < ");
        
    printf("\nPer terminare l'immissione e visualizzare la stringa premere INVIO\n");
        while((
    temp=getchar())!='\n'){
               
    stringa[i]=temp;
               
    stringa=(char*)realloc(stringa,sizeof(char));
               
    i++;
        }
        
    stringa[i]='\0';
        
    printf("Stringa inserita > %s\n"stringa);
        
    getchar();
        return 
    0;

    in questo modo tu hai riempi una stringa fin quando non viene premuto invio poi sulla stringa ci fai tutti i controlli che vuoi . . .
    Se una funzione riceve come argomento un puntatore di puntatore di puntatore quando la invochi ricordati che puo ricevere o un puntatore di puntatore di puntatore o l'indirizzo di un puntatore di puntatore

  6. #6
    Semmai...
    codice:
    stringa=(char*)realloc(stringa,i*sizeof(char));
    e subito dopo la printf
    codice:
    free(stringa);
    . Comunque credo che abbia più senso riallocare la memoria solo ogni tanto (ad esempio ogni 1024 bytes).
    codice:
        #define BUFFERINCREMENT 1024
        stringa=(char*)malloc(sizeof(char)*BUFFERINCREMENT);
        if(stringa!=NULL) 
            printf("\n > memoria allocata correttamente < ");
        else
        {
            printf("\n > impossibile allocare la memoria < ");
            return 1;
        }
        printf("\nPer terminare l'immissione e visualizzare la stringa premere INVIO\n");
        while((temp=getchar())!='\n'){
               stringa[i]=temp;
               if(!(i%BUFFERINCREMENT)&&i)
               {
                   if((stringa=(char*)realloc(stringa,i*sizeof(char)+BUFFERINCREMENT*sizeof(char)))==0);
                   {
                       printf("\n > impossibile riallocare la memoria < ");
                       return 2;
                   }
               i++;
               }
        }
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    49
    ho capito cosa intendi, si la soluzione mi piace, grazie
    però mi stampa delle cose brutte:

    *** glibc detected *** ./stand2: realloc(): invalid next size: 0x0804a008 ***
    ======= Backtrace: =========
    /lib/tls/i686/cmov/libc.so.6[0xb7e9318a]
    /lib/tls/i686/cmov/libc.so.6(realloc+0xfe)[0xb7e9508e]
    ./stand2[0x80484bc]
    /lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xdc)[0xb7e3febc]
    ./stand2[0x80483d1]


    forse bisogna fare una cosa tipo:

    Codice PHP:
    stringa=(char*)realloc(stringa,strlen(stringa)*sizeof(char)+1); 
    Aumentare di 1 la dimesione della stringa ogni volta. In questo modo stampa la stringa correttamente. Forse alloco più spazio del necessario, ma forse no
    grazie ancora.

    EDIT: ho letto ora il messaggio di MItaly

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.