|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Junior Member
Iscritto dal: Dec 2013
Messaggi: 20
|
Acquisizione di Stringhe
Sera ragazzi, altro problema. Dovrei acquisire delle stringhe (3 in particolare) da mettere all'interno di tre variabili di tipo char allocate dinamicamente.
Per allocare una stringa voglio fare questo: stringa = (char *)malloc(sizeof(char)*lunghezza + 1); Il +1 è dato dal fatto che voglio che sia mantenuto il posto per il carattere terminatore. Ora la lunghezza ho due modi per averla, una è chiederla direttamente all'utente (e non voglio farlo), l'altra dovreste dirmela voi, so che la strada giusta è con getchar(); carattere per carattere ma non so esattamente dove andare a parare (in rete non riesco a trovare nulla). Grazie dell'aiuto ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Perchè getchar? In C hai fgets
Codice:
char str[256]; printf("Inserire stringa: "); fgets(str, 256, stdin); |
![]() |
![]() |
![]() |
#3 |
Junior Member
Iscritto dal: Dec 2013
Messaggi: 20
|
Con fgets non ho purtroppo un allocazione dinamica della memoria con precisione. Per dirti, ho creato il seguente codice:
Codice:
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char *stringa, c; int i = 0; stringa = (char *)malloc(sizeof(char)); if ( stringa == NULL ) printf("Memoria non disponibile"); printf("Inserisci la stringa\n"); while ( (c = getchar()) != '\n') { stringa = (char *)realloc(stringa, (strlen(stringa)*sizeof(char))+1); stringa[i] = c; i++; } stringa[strlen(stringa)+1] = '\0'; printf("stringa: %s\n",stringa); return(0); } Ultima modifica di BigMeister : 30-04-2014 alle 23:39. |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
Queste stringhe non hanno una dimensione massima oltre la quale non vanno?
Come l'hai fatto tu è computazionalmente molto oneroso. Riallocare ogni volta la memoria è un processo lento e genera molta frammentazione in memoria. Comunque, se vuoi allocare altre stringhe, devi rifare il malloc e tutto il ciclo while. Ovviamente devono conservare il puntatore alla stringa precedente da qualche parte. Magari in un array o in una lista allocata dinamicamente. |
![]() |
![]() |
![]() |
#5 |
Junior Member
Iscritto dal: Dec 2013
Messaggi: 20
|
No, non hanno una dimensione massima. In compenso non devo preoccuparmi della complessità computazionale perchè il programma è molto piccolo e non impiegherà troppe risorse. Soluzioni?
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jan 2008
Messaggi: 8406
|
La soluzione è che, per ogni stringa che devi leggere, devi effettuare una malloc e poi le varie realloc. Il puntatore al buffer contenente la stringa precedente va ovviamente conservato da qualche parte, in un'array o una lista.
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: May 2001
Messaggi: 12815
|
Quote:
![]() Comunque sotto Linux hai anche getline() che dovrebbe gestire in automatico l'allocazione. Edit: provato ora, anche getline alloca più del dovuto: Codice:
#include <stdlib.h> #include <stdio.h> int main(void) { ssize_t r; size_t allocated = 0; char* my_string = NULL; r = getline(&my_string, &allocated, stdin); if (r < 0) { printf("Error while reading.\n"); return r; } printf("Allocated: %u bytes\n", allocated); printf("Read: %d bytes\n", r); printf("String: %s\n", my_string); free(my_string); } Codice:
[giulio@giulio-linux STRING]$ ./a.out Ciao! Allocated: 120 bytes Read: 6 bytes String: Ciao! ![]() Ultima modifica di WarDuck : 02-05-2014 alle 11:24. |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:42.