Torna indietro   Hardware Upgrade Forum > Software > Programmazione

FUJIFILM X-T30 III, la nuova mirrorless compatta
FUJIFILM X-T30 III, la nuova mirrorless compatta
FUJIFILM X-T30 III è la nuvoa fotocamera mirrorless pensata per chi si avvicina alla fotografia e ricerca una soluzione leggera e compatta, da avere sempre a disposizione ma che non porti a rinunce quanto a controllo dell'immagine.
Oracle AI World 2025: l'IA cambia tutto, a partire dai dati
Oracle AI World 2025: l'IA cambia tutto, a partire dai dati
Da Las Vegas, la visione di Larry Ellison e la concretezza di Clay Magouyrk definiscono la nuova traiettoria di Oracle: portare l’intelligenza artificiale ai dati, non i dati all’intelligenza, costruendo un’infrastruttura cloud e applicativa in cui gli agenti IA diventano parte integrante dei processi aziendali, fino al cuore delle imprese europee
Micron e millisecondi: la piattaforma ServiceNow guida l'infrastruttura IT di Aston Martin F1
Micron e millisecondi: la piattaforma ServiceNow guida l'infrastruttura IT di Aston Martin F1
Dalla precisione estrema dei componenti alla gestione digitale dei processi: come la piattaforma ServiceNow consente ad Aston Martin Aramco Formula One Team di ottimizzare risorse IT e flussi operativi in un ambiente dove ogni millesimo di secondo conta
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-12-2005, 16:27   #1
redcloud
Bannato
 
L'Avatar di redcloud
 
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?
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2005, 16:35   #2
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
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" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2005, 16:55   #3
redcloud
Bannato
 
L'Avatar di redcloud
 
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.
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2005, 17:27   #4
Ziosilvio
Moderatore
 
L'Avatar di Ziosilvio
 
Iscritto dal: Nov 2003
Messaggi: 16211
Quote:
Originariamente inviato da redcloud
Grazie, l'idea è quella ma vorrei sapere se c'è una funzione standard preposta. A quanto pare no.
Anche per quello che ricordo io, nella libreria standard una funzione simile non c'e'.
__________________
Ubuntu è un'antica parola africana che significa "non so configurare Debian" Chi scherza col fuoco si brucia.
Scienza e tecnica: Matematica - Fisica - Chimica - Informatica - Software scientifico - Consulti medici
REGOLAMENTO DarthMaul = Asus FX505 Ryzen 7 3700U 8GB GeForce GTX 1650 Win10 + Ubuntu
Ziosilvio è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2005, 17:29   #5
sirus
Senior Member
 
Iscritto dal: Mar 2004
Messaggi: 16053
Quote:
Originariamente inviato da redcloud
Grazie, l'idea è quella ma vorrei sapere se c'è una funzione standard preposta. A quanto pare no.
no...non esistono funzioni standard per la gestione di liste/pile/code...il campo di utilizzo è troppo eterogeneo
comunque mi sembra il metodo migliore...e comunque con una lista è necessario usare l'allocazione dinamica
sirus è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2005, 18:02   #6
NA01
Senior Member
 
L'Avatar di NA01
 
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
la getline se trova un puntatore nullo alloca la memoria che serve. ciao!
NA01 è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2005, 18:03   #7
sirus
Senior Member
 
Iscritto dal: Mar 2004
Messaggi: 16053
Quote:
Originariamente inviato da NA01
la getline se trova un puntatore nullo alloca la memoria che serve. ciao!
questa mi mancava grazie...
sirus è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2005, 18:04   #8
NA01
Senior Member
 
L'Avatar di NA01
 
Iscritto dal: Jun 2003
Città: Genova
Messaggi: 5676
ah, forse però non è portabile su win....
chi ha windows controlli

ciao
NA01 è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2005, 18:07   #9
NA01
Senior Member
 
L'Avatar di NA01
 
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!
NA01 è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2005, 18:32   #10
redcloud
Bannato
 
L'Avatar di redcloud
 
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 18:47.
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2005, 18:47   #11
sirus
Senior Member
 
Iscritto dal: Mar 2004
Messaggi: 16053
Quote:
Originariamente inviato da redcloud
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?
si...però sfondi l'array che hai allocato il che comporta problemi durante l'esecuzione se fai uso di altre variabili dinamiche...
sirus è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2005, 18:52   #12
redcloud
Bannato
 
L'Avatar di redcloud
 
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!
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2005, 18:55   #13
sirus
Senior Member
 
Iscritto dal: Mar 2004
Messaggi: 16053
Quote:
Originariamente inviato da redcloud
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!
e perché dovrebbe?
il C non è così fiscale in questi casi
sirus è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2005, 18:59   #14
redcloud
Bannato
 
L'Avatar di redcloud
 
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.
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2005, 19:02   #15
sirus
Senior Member
 
Iscritto dal: Mar 2004
Messaggi: 16053
Quote:
Originariamente inviato da redcloud
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.
ovvio...quella memoria è gestita staticamente nel DataSegment oppure nell'apposita sezione RDA di ogni sottoprogramma. Quella che tu allochia con malloc risiede nella HEAP e li il controllo non è lo stesso... e poi quando si lavora con i puntatori (seriamente) bisogna sapere dove si va a parare con il prorpio codice
sirus è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2005, 20:55   #16
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
Quote:
Originariamente inviato da Ziosilvio
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.
Ziosilvio scusa se dal basso della mia inesperienza mi permetto di chiederti (mi permetto di darti del tu, se non gradisci dimmelo pure che edito... ) chiarimenti, ma il mio dubbio è questo. Secondo la tua idea un nodo della lista conterrebbe un array dichar di lunghezza predefinita, se poi non basta quell'array viene allocato un altro nodo e si continua a memorizzare in quello nuovo. Ma a questo punto visto che comunque le operazioni di allocazione in memoria deve farle lo stesso non conviene direttamente dichiararsi un puntatore ad un vettore di char di lunghezza predefinita e poi eventualmente riallocarlo con dimensione 2*LENGTH?
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
Old 10-12-2005, 11:22   #17
sirus
Senior Member
 
Iscritto dal: Mar 2004
Messaggi: 16053
Quote:
Originariamente inviato da VegetaSSJ5
Ziosilvio scusa se dal basso della mia inesperienza mi permetto di chiederti (mi permetto di darti del tu, se non gradisci dimmelo pure che edito... ) chiarimenti, ma il mio dubbio è questo. Secondo la tua idea un nodo della lista conterrebbe un array dichar di lunghezza predefinita, se poi non basta quell'array viene allocato un altro nodo e si continua a memorizzare in quello nuovo. Ma a questo punto visto che comunque le operazioni di allocazione in memoria deve farle lo stesso non conviene direttamente dichiararsi un puntatore ad un vettore di char di lunghezza predefinita e poi eventualmente riallocarlo con dimensione 2*LENGTH?
secondo me Ziosilvio intendeva qualche cosa tipo questa
Codice:
typedef struct {
    char c;
    nodo* next;
} nodo;
come definizione di dato quando ti serve un nuovo carattere lo allochi senza problemi
sirus è offline   Rispondi citando il messaggio o parte di esso
Old 10-12-2005, 11:37   #18
redcloud
Bannato
 
L'Avatar di redcloud
 
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.
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 10-12-2005, 11:42   #19
sirus
Senior Member
 
Iscritto dal: Mar 2004
Messaggi: 16053
Quote:
Originariamente inviato da redcloud
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.
si ma vuoi mettere la semplicità della funzione/codice che acquisisce in strutture che contengono caratteri invece che contengono array ?
bisogna sempre guardare rapporto efficienza/semplicità
sirus è offline   Rispondi citando il messaggio o parte di esso
Old 10-12-2005, 11:46   #20
VegetaSSJ5
Senior Member
 
L'Avatar di VegetaSSJ5
 
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
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...
VegetaSSJ5 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


FUJIFILM X-T30 III, la nuova mirrorless compatta FUJIFILM X-T30 III, la nuova mirrorless compatta
Oracle AI World 2025: l'IA cambia tutto, a partire dai dati Oracle AI World 2025: l'IA cambia tutto, a parti...
Micron e millisecondi: la piattaforma ServiceNow guida l'infrastruttura IT di Aston Martin F1 Micron e millisecondi: la piattaforma ServiceNow...
ASUS GeForce RTX 5080 Noctua OC Edition: una custom fenomenale, ma anche enorme ASUS GeForce RTX 5080 Noctua OC Edition: una cus...
Dreame Aqua10 Ultra Roller, la pulizia di casa con un rullo Dreame Aqua10 Ultra Roller, la pulizia di casa c...
Ferrari F76: la prima hypercar NFT segna...
Am9080, sono passati 50 anni dal primo p...
Inquinamento record a Nuova Delhi: il go...
Il Giappone e il 'fetish' per i dischi o...
AMD presenterà il Ryzen 5 7500X3D...
Un aspirapolvere intelligente diventa un...
Il nuovo M5 fa la differenza anche nel g...
Le AirPods ora sono in grado di rilevare...
Oggi su Amazon succede di tutto: sconti ...
'Copilot Gaming mi spiava!': le accuse d...
Mova P50 Pro Ultra, robot aspirapolvere ...
Speciale action cam: doppio sconto solo ...
Eureka J15 Ultra conquista Amazon: aspir...
Game Pass è sempre più ric...
20 milioni di utenti contro Apple: grand...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 08:51.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v