|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Bannato
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
|
[C] stringa da stdin
Salve, ho bisogno di una funzione che prenda in input (dallo stdin) una stringa senza spazi di lunghezza arbitraria e che la memorizzi automaticamente in un array senza quindi usare malloc apriori (proprio perchè la lunghezza della stringa data in input è variabile). Mi servirebbe standard. Come fareste?
|
![]() |
![]() |
![]() |
#2 |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Non e' un problema banale.
Io userei una lista anziche' un array. I campi degli elementi della lista sarebbero un buffer di un numero fisso di char, e un puntatore all'elemento successivo. Man mano che leggi un carattere alla volta con getchar, lo inserisci nel buffer dell'elemento corrente: se non bastano, allochi un nuovo elemento della lista e cominci da li'. Quando hai finito di leggere l'input, calcoli quanto e' lunga la stringa, allochi un array e ci "svuoti" i buffer uno dopo l'altro.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
![]() |
![]() |
![]() |
#3 |
Bannato
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
|
Grazie, l'idea è quella ma vorrei sapere se c'è una funzione standard preposta. A quanto pare no.
|
![]() |
![]() |
![]() |
#4 | |
Moderatore
Iscritto dal: Nov 2003
Messaggi: 16211
|
Quote:
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" ![]() Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu |
|
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Quote:
![]() comunque mi sembra il metodo migliore...e comunque con una lista è necessario usare l'allocazione dinamica ![]() |
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
|
la getline se trova un puntatore nullo alloca la memoria che serve. ciao!
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
|
ah, forse però non è portabile su win....
chi ha windows controlli ![]() ciao |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
|
confermo. è un'estensione gnu_sources e su dev c++ non compila...
scusate per il falso allarme ciao! |
![]() |
![]() |
![]() |
#10 |
Bannato
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
|
Provate ad eseguire questo codice:
char *a = (char *) malloc(sizeof(char)); scanf("%s", a); Alloco un puntatore di 1 char e in stdin scrivo una qualsiasi stringa superiore a 1 char. Nessun errore. E' normale? EDIT: sto lavorando sotto Debian, probabilmente sotto Windows darebbe errore. Ultima modifica di redcloud : 09-12-2005 alle 17:47. |
![]() |
![]() |
![]() |
#11 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Quote:
|
|
![]() |
![]() |
![]() |
#12 |
Bannato
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
|
Quindi nella tavola delle variabili risulterebbe l'array di 1 char. Una successiva malloc potrebbe tranquillamente sovrascrivere "lo straripamento". Capito. Però un minimo di errore lo potrebbe dare, che palle! Si deve andare a intuizione!
|
![]() |
![]() |
![]() |
#13 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Quote:
il C non è così fiscale in questi casi ![]() |
|
![]() |
![]() |
![]() |
#14 |
Bannato
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
|
E' parecchio che non usavo il C ma mi ricordo che quando lavoravo con i for e gli indici degli array, se sforavo, mi andava tranquillamente in Segmentation fault. Cosa che così non avviene più. Mah.
|
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Quote:
![]() ![]() |
|
![]() |
![]() |
![]() |
#16 | |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
|
Quote:
![]() ![]() |
|
![]() |
![]() |
![]() |
#17 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Quote:
Codice:
typedef struct { char c; nodo* next; } nodo; ![]() ![]() |
|
![]() |
![]() |
![]() |
#18 |
Bannato
Iscritto dal: Feb 2003
Città: Anche Chuck Norris usa Debian e Gnome
Messaggi: 1270
|
Magari inserendo un array anzichè un carattere. Allocare una struct per un solo carattere non mi sembra così efficiente. Creare manualmente quindi una sorta di bufferizzazione.
|
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Mar 2004
Messaggi: 16053
|
Quote:
![]() bisogna sempre guardare rapporto efficienza/semplicità ![]() |
|
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9569
|
vi ripeto che non continuo a vedere la convenienza della soluzione con la lista rispetto all'usare direttamente un vettore riallocabile di char. per farvi un esempio è come se doveste entrare in macchina e lo fate entrando dal bagagliaio per poi andarvi a sedere al vostro posto...
![]() ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:46.