Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
L'abbonamento Ultimate di GeForce NOW ora comprende la nuova architettura Blackwell RTX con GPU RTX 5080 che garantisce prestazioni tre volte superiori alla precedente generazione. Non si tratta solo di velocità, ma di un'esperienza di gioco migliorata con nuove tecnologie di streaming e un catalogo giochi raddoppiato grazie alla funzione Install-to-Play
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Deebot X11 Omnicyclone implementa tutte le ultime tecnologie Ecovacs per l'aspirazione dei pavimenti di casa e il loro lavaggio, con una novità: nella base di ricarica non c'è più il sacchetto di raccolta dello sporco, sostituito da un aspirapolvere ciclonico che accumula tutto in un contenitore rigido
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio
Grazie ad un mocio rotante che viene costantemente bagnato e pulito, Narwal Flow assicura un completo e capillare lavaggio dei pavimenti di casa. La logica di intellignza artificiale integrata guida nella pulizia tra i diversi locali, sfruttando un motore di aspirazione molto potente e un sistema basculante per la spazzola molto efficace sui tappeti di casa
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-12-2005, 15: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, 15: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, 15: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, 16: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, 16: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, 17: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, 17: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, 17: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, 17: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, 17: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 17:47.
redcloud è offline   Rispondi citando il messaggio o parte di esso
Old 09-12-2005, 17: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, 17: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, 17: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, 17: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, 18: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, 19: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, 10: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, 10: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, 10: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, 10: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


Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre Prova GeForce NOW upgrade Blackwell: il cloud ga...
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
HONOR Magic V5: il pieghevole ultra sottile e completo! La recensione HONOR Magic V5: il pieghevole ultra sottile e co...
Johnson Controls amplia la gamma di solu...
NASA Perseverance: il rover potrebbe ave...
Quelli di Immuni si 'pappano' Vimeo: Ben...
Changan lancia la Deepal S05 in Europa, ...
Substrati in vetro, Intel smentisce le v...
ECOVACS DEEBOT T50 PRO OMNI Gen2 fa piaz...
Windelo 62: catamarano a vela che unisce...
Francia, in arrivo un incentivo di 1.000...
Haier, la sorpresa a IFA: la lavatrice C...
GeForce RTX 5000 SUPER in arrivo? Sembra...
Ionity prova una soluzione contro i ladr...
Pirateria, svolta clamorosa: Dazn e Lega...
Maxi richiamo Toyota e Lexus: oltre 900....
Blackwell Ultra: fino al 45% di prestazi...
Neuralink: 12 pazienti hanno usato l'imp...
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: 17:45.


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