Torna indietro   Hardware Upgrade Forum > Software > Programmazione

HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione
HONOR ha finalmente lanciato il suo nuovo flagship: Magic 8 Pro. Lo abbiamo provato a fondo in queste settimane e ve lo raccontiamo nella nostra recensione completa. HONOR rimane fedele alle linee della versione precedente, aggiungendo però un nuovo tasto dedicato all'AI. Ma è al suo interno che c'è la vera rivoluzione grazie al nuovo Snapdragon 8 Elite Gen 5 e alla nuova MagicOS 10
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata
Le webcam Insta360 Link 2 Pro e Link 2C Pro sono una proposta di fascia alta per chi cerca qualità 4K e tracciamento automatico del soggetto senza ricorrere a configurazioni complesse. Entrambi i modelli condividono sensore, ottiche e funzionalità audio avanzate, differenziandosi per il sistema di tracciamento: gimbal a due assi sul modello Link 2 Pro, soluzione digitale sul 2C Pro
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-11-2008, 17:26   #1
mto89
Senior Member
 
L'Avatar di mto89
 
Iscritto dal: Jan 2007
Città: villa verucchio
Messaggi: 1921
[c] grossi dubbi con le stringhe

ho un po di problemi con le stringhe in c:

1. perchè se scrivo
char prova[5]={"ciao"}; funziona ma se scrivo:

char prova[5];
prova="ciao"; oppure prova={"ciao"}; non va???

in piu ho notato che scrivendo
char *prova[5];
prova="ciao"; funziona, ma per quale motivo?

2. ho una struct del tipo:
struct prova{ char stringa[5]};
struct prova struttura;
struttura.stringa="ciao"; e non funziona quest'ultima riga, come faccio?

vi sarei davvero grato di una mano! In sostanza come posso modificare una stringa dopo l'inizializzazione?
__________________
CPU: Amd Phenom II 955--MB: Gigabyte GA-890GPA-UD3H--RAM:4 GB DDR3--SV: ATI Radeon HD 5770--HD: Western Digital Caviar Black 500 gb--ALI:: Corsair 650w--MONITOR: SyncMaster P2270--ROUTER: Netgear DG834G--SO: Win 7 Professional 64 bit
mto89 è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 00:47   #2
royaleagle
Senior Member
 
L'Avatar di royaleagle
 
Iscritto dal: Jan 2007
Messaggi: 1237
Non funziona perchè prova (nel punto 1) e stringa (nel punto 2) sono puntatori al primo elemento dei rispettivi array, che sono array di char.
Quindi tu invece assegni una stringa ad un char.
__________________
59 trattative ok (ultimo: IntoTrouble)
royaleagle è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 01:09   #3
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
1. "Ciao" è un cosiddetto literal constant. Di fatto è un stringa che è allocata in memoria al momento della creazione del programma. Ha quindi una sua allocazione ed una sua posizione in memoria.

char *p = "Ciao";

assegna al puntatore p l'indirizzo del literal constant.

{"Ciao"} o "Ciao" si possono usare per inizializzare le stringhe...ma SOLO in fase di inizializzazione.
Infatti se io scrivo:

char x[5];
x = "ciao";

è un errore perché x ha un puntatore predefinito durante l'inizializzazione e NON MODIFICABILE. Quindi è impossibile modifcare x assegnandogli il puntatore a literal constant.

2. Per modificare il valore di una stringa si usa la funzione di libreria strcpy.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 14:20   #4
mto89
Senior Member
 
L'Avatar di mto89
 
Iscritto dal: Jan 2007
Città: villa verucchio
Messaggi: 1921
Quote:
Originariamente inviato da cionci Guarda i messaggi
1. "Ciao" è un cosiddetto literal constant. Di fatto è un stringa che è allocata in memoria al momento della creazione del programma. Ha quindi una sua allocazione ed una sua posizione in memoria.

char *p = "Ciao";

assegna al puntatore p l'indirizzo del literal constant.

{"Ciao"} o "Ciao" si possono usare per inizializzare le stringhe...ma SOLO in fase di inizializzazione.
Infatti se io scrivo:

char x[5];
x = "ciao";

è un errore perché x ha un puntatore predefinito durante l'inizializzazione e NON MODIFICABILE. Quindi è impossibile modifcare x assegnandogli il puntatore a literal constant.

2. Per modificare il valore di una stringa si usa la funzione di libreria strcpy.
grazie mille, quindi se scrivo
char*prova;
*prova="ciao";
funziona perchè vado ad agire sul contenuro dell'indirizzo puntato giusto?

quindi senza le function della libreria string è praticamente impossibile lavorare bene con le stringhe no?
__________________
CPU: Amd Phenom II 955--MB: Gigabyte GA-890GPA-UD3H--RAM:4 GB DDR3--SV: ATI Radeon HD 5770--HD: Western Digital Caviar Black 500 gb--ALI:: Corsair 650w--MONITOR: SyncMaster P2270--ROUTER: Netgear DG834G--SO: Win 7 Professional 64 bit
mto89 è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 14:37   #5
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da mto89 Guarda i messaggi
quindi senza le function della libreria string è praticamente impossibile lavorare bene con le stringhe no?
No, puoi lavorarci lo stesso, ma in pratica ciò significa andare a implementarsi le stesse funzionalità che quella libreria espone.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 14:52   #6
royaleagle
Senior Member
 
L'Avatar di royaleagle
 
Iscritto dal: Jan 2007
Messaggi: 1237
Quote:
Originariamente inviato da mto89 Guarda i messaggi
grazie mille, quindi se scrivo
char*prova;
*prova="ciao";
funziona perchè vado ad agire sul contenuro dell'indirizzo puntato giusto?
No, devi scrivere:
Codice:
char*prova;
prova="ciao";
__________________
59 trattative ok (ultimo: IntoTrouble)
royaleagle è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 15:00   #7
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da royaleagle Guarda i messaggi
No, devi scrivere:
Codice:
char*prova;
prova="ciao";
E' legale, ma attenzione...è rischioso perché questo provoca un errore:

char *prova;
prova = "ciao";
prova[1] = 'b'; <------è errato perché si va a modificare un literal constant

Non so in C, ma in C++ prova = "ciao" genera uno warning:
/home/cionci/provacpp/prova.cpp|163|warning: deprecated conversion from string constant to ‘char*’|

Al contrario questo non lo genera su prova = "ciao", ma viene segnalato un errore sulla riga succesiva:

const char *prova;
prova = "ciao";
prova[1] = 'b'; <------errore
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 17:47   #8
mto89
Senior Member
 
L'Avatar di mto89
 
Iscritto dal: Jan 2007
Città: villa verucchio
Messaggi: 1921
ok ora è tutto un poco più chiaro! sono alle prese col c da qualche mese, prima avevo studiato java e pascal, trovo che una delle "pecche" maggiori del c sia la mancanza di una variabile di tipo string, che renderebbe la risoluzione di molti problemi piu semplici, non trovate anche voi?
__________________
CPU: Amd Phenom II 955--MB: Gigabyte GA-890GPA-UD3H--RAM:4 GB DDR3--SV: ATI Radeon HD 5770--HD: Western Digital Caviar Black 500 gb--ALI:: Corsair 650w--MONITOR: SyncMaster P2270--ROUTER: Netgear DG834G--SO: Win 7 Professional 64 bit
mto89 è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 17:54   #9
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Concordo...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 18:11   #10
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da mto89 Guarda i messaggi
ok ora è tutto un poco più chiaro! sono alle prese col c da qualche mese, prima avevo studiato java e pascal, trovo che una delle "pecche" maggiori del c sia la mancanza di una variabile di tipo string, che renderebbe la risoluzione di molti problemi piu semplici, non trovate anche voi?
Più semplice ma meno performante. È il rovescio della medaglia

x Cionci :
Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 18:15   #11
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Vincenzo1968 Guarda i messaggi
Più semplice ma meno performante. È il rovescio della medaglia

x Cionci :
C'avrei giurato
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 18:18   #12
Vincenzo1968
Bannato
 
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
C'avrei giurato
Ohé banryu,

sto sperimentando delle faccine che non avevo mai utilizzato e che mi piacciono un sacco. Perciò tie':


Vincenzo1968 è offline   Rispondi citando il messaggio o parte di esso
Old 21-11-2008, 18:20   #13
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Allora buon week end , lol
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2008, 16:32   #14
Alex_87_xelA
Senior Member
 
Iscritto dal: Nov 2008
Messaggi: 530
Quote:
Originariamente inviato da mto89 Guarda i messaggi
ho un po di problemi con le stringhe in c:

1. perchè se scrivo
char prova[5]={"ciao"}; funziona ma se scrivo:

char prova[5];
prova="ciao"; oppure prova={"ciao"}; non va???
char prova[5] = "ciao";

analizziamo da destra a sinistra :
-"ciao"
questo non fa altro che creare una stringa costante (const char *)

-char prova[5]
questo crea un vettore di 5 elementi di tipo char;
come è gestito un vettore : un vettore è gestito come un puntatore costante al primo elemento, infatti utilizzando il suo nome (nel tuo caso - prova) non fai altro che utilizzare l'indirizzo della prima locazione di memoria puntata da tale variabile.
come si gestiscono i puntatori costanti, devono essere subito inizzializzati all'atto della dichiarazione, quindi bisogna definirli subito.

ecco perchè nel primo caso funziona.
poi nel secondo caso, come detto, essendo un puntatore costante, non puo essere riassegnato.

Quote:
Originariamente inviato da mto89 Guarda i messaggi
in piu ho notato che scrivendo
char *prova[5];
prova="ciao"; funziona, ma per quale motivo?
prova = "ciao"; NON funziona
per farlo funzionare dovresti fare :
*prova = "ciao";

Quote:
Originariamente inviato da mto89 Guarda i messaggi
2. ho una struct del tipo:
struct prova{ char stringa[5]};
struct prova struttura;
struttura.stringa="ciao"; e non funziona quest'ultima riga, come faccio?
il motivo è lo stesso che ti ho spiegato prima

Quote:
Originariamente inviato da mto89 Guarda i messaggi
vi sarei davvero grato di una mano! In sostanza come posso modificare una stringa dopo l'inizializzazione?
Codice:
//sd = stringa destinazione
//so = stringa origina
char *CopiaStringa(char *sd, const char *so)
{
	char *temp = sd;
	while(*sd++ = *so++) ;
	return sd;
}
Alex_87_xelA è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2008, 16:49   #15
Alex_87_xelA
Senior Member
 
Iscritto dal: Nov 2008
Messaggi: 530
Quote:
Originariamente inviato da cionci Guarda i messaggi
E' legale, ma attenzione...è rischioso perché questo provoca un errore:
scusa, ma se da un'errore allora non è legale .... no ?
Alex_87_xelA è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2008, 16:53   #16
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Alex_87_xelA Guarda i messaggi
scusa, ma se da un'errore allora non è legale .... no ?
La modifica della stringa provoca un errore, non l'assegnazione.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2008, 16:55   #17
Alex_87_xelA
Senior Member
 
Iscritto dal: Nov 2008
Messaggi: 530
Quote:
Originariamente inviato da cionci Guarda i messaggi
char *prova;
prova = "ciao";
prova[1] = 'b'; <------è errato perché si va a modificare un literal constant
prova = "ciao"; <----- questo è un'errore
proca[1] = 'b'; <------ questo non è un'errore in questo caso.

era un'errore se si aveva :
const char *prova;
Alex_87_xelA è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2008, 16:55   #18
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Alex_87_xelA Guarda i messaggi
scusa, ma se da un'errore allora non è legale .... no ?
La modifica della stringa provoca un errore, non l'assegnazione.
L'assegnazione di un literal constant provoca uno warning che l'assegnamento è deprecato. Il fatto che sia deprecata non significa che sia illegale, è legale, ma deprecata.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2008, 16:57   #19
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Alex_87_xelA Guarda i messaggi
prova = "ciao"; <----- questo è un'errore
proca[1] = 'b'; <------ questo non è un'errore in questo caso.

era un'errore se si aveva :
const char *prova;
No, l'errore è la modifica tramite prova, visto che prova punta ad un literal constant. Se non si usa quel puntatore per modificare il literal costant allora non si avranno problemi ed il codice continuerà a funzionare. Leggi gli errori, non me li sono inventati, li ha scritti il compilatore.
Se invece si va a fare una modifica tramite il puntatore il codice provocherà un segmentation fault a runtime.

Ultima modifica di cionci : 22-11-2008 alle 16:59.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 22-11-2008, 17:04   #20
Alex_87_xelA
Senior Member
 
Iscritto dal: Nov 2008
Messaggi: 530
Quote:
Originariamente inviato da cionci Guarda i messaggi
Se invece si va a fare una modifica tramite il puntatore il codice provocherà un segmentation fault a runtime.
ho appena provato e hai ragione
ero andato un po a ricordi
Alex_87_xelA è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Insta360 Link 2 Pro e 2C Pro: le webcam 4K che ti seguono, anche con gimbal integrata Insta360 Link 2 Pro e 2C Pro: le webcam 4K che t...
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
TikTok chiarisce il funzionamento della ...
Samsung Galaxy A07 5G: il nuovo entry le...
Realme 16 in arrivo: un mix tra iPhone A...
Domenica di follia su Amazon: iPhone 17 ...
Questo portatile HP OMEN con Core Ultra ...
Robot aspirapolvere al prezzo giusto: le...
Il nuovo M5 Max potrebbe avere una GPU p...
Pulizie automatiche al top (e a prezzo B...
Casa più calda, spese più leggere: Tado ...
Mini PC mostruoso in offerta nascosta su...
Netflix promette 45 giorni di esclusivit...
Gigabyte: un handheld? Sì, ma sol...
Samsung conferma l'arrivo di tre variant...
Sottile, veloce e con un'ottima autonomi...
Il top di gamma compatto di OnePlus &egr...
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: 18:08.


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