Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura
Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura
Il primo Micro RGB di Samsung per il salotto è il 65 pollici da 2.749 euro. Sul banco di misura abbiamo rilevato 2.000 nit di picco, nero assoluto con il local dimming e il 91,4% del BT.2020, il colore più ampio che abbiamo misurato su un LCD
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre
Apple ha rinnovato iPhone 18 Pro soprattutto dentro: chip A20 Pro a 2 nm con memoria affiancata al SoC, camera di vapore tre volte più ampia, Dynamic Island più piccola del 25% grazie a Face ID sotto il display e fotocamera principale con diaframma variabile da f/1.48 a f/4. Lo abbiamo misurato al colorimetro e nei benchmark, usato con iOS 27 e messo alla prova in fotografia tra laghi, borghi e interni poco illuminati
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34
A Londra, per il trentennale dei Toughbook, Panasonic ha presentato il tablet G3 e il 2-in-1 34. Con Jon Tucker, a capo dell'ingegneria europea, abbiamo parlato di ciò che non si vede: batterie, antenne, porte seriali e accorgimenti nati sul campo
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: 16215
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: 16215
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


Samsung Micro RGB R95H, il primo LCD a LED rossi, verdi e blu di Samsung alla prova del banco di misura Samsung Micro RGB R95H, il primo LCD a LED rossi...
iPhone 18 Pro: la recensione del miglior iPhone compatto di sempre iPhone 18 Pro: la recensione del miglior iPhone ...
Panasonic, 30 anni di Toughbook: la "Bibbia" di mille regole dietro i nuovi G3 e 34 Panasonic, 30 anni di Toughbook: la "Bibbia...
realme C100x, lo smartphone economico con la batteria da 7500 mAh. La recensione realme C100x, lo smartphone economico con la bat...
Star Wars Zero Company è l'erede di XCOM 2 Star Wars Zero Company è l'erede di XCOM ...
Rimodulazioni in arrivo per i clienti Vo...
Ultimo giorno del 15% di sconto Amazon S...
Un ottobre ricco di novità per Ap...
Samsung Galaxy S27 Ultra, i rumor contin...
'Per essere liberi bisogna essere temuti...
Ecco i 4 mini PC migliori del Prime Day ...
6 portatili TOP ancora disponibili con A...
Apple Intelligence occupa troppo spazio?...
GTA 6 in streaming solo su XBOX Cloud Ga...
Mistral Large 4 'Le Chonk', il nuovo mod...
XBOX torna a crescere: Asha Sharma rilan...
Hyundai IONIQ 3: l'abbiamo guidata per l...
Ricarica wireless dinamica fino a 150 kW...
Troppi report invalidi generati dall'IA:...
Furto di identità su scala nazion...
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: 07:52.


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