|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 783
|
[C] Assegnare lettere ad un array di char
Una domanda banale: come faccio ad assegnare ad una variabile di tipo char una frase? Ho visto esempi solo quando vengono dichiarate le variabili ma se lo facio all'interno del programma mi da errore. Come si fa?
Grazie Codice:
#include <string.h> #include <stdio.h> #include <stdlib.h> int main(void) { char nome1[10]; char nome2[10] = "Giacomo"; //OK printf("Inserisci un nome: "); scanf("%s",&nome1);; nome2="Luca"; //error C2440: '=' : cannot convert from 'int' to 'char [10]' printf("Nome inserito %s e secondo %s\n",nome1,nome2); system("PAUSE"); return 1; }
__________________
"May the wind always be at your back and the sun upon your face. And may the wings of destiny carry you aloft to dance with the stars...." Ultima modifica di salvodel : 21-01-2008 alle 17:48. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
|
strcpy
__________________
![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 783
|
__________________
"May the wind always be at your back and the sun upon your face. And may the wings of destiny carry you aloft to dance with the stars...." |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Mar 2006
Città: Bergamo
Messaggi: 2499
|
si, ovviamente sempre facendo attenzione a non sforare fuori dall'allocazione di nome2.
è consigliabile usare strncpy per limitare la copia dei caratteri alla lunghezza della destinazione (ricordandosi di calcolare il terminatore di stringa)
__________________
![]() |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 783
|
Grazie mille.
__________________
"May the wind always be at your back and the sun upon your face. And may the wings of destiny carry you aloft to dance with the stars...." |
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Aug 2004
Città: Modena
Messaggi: 96
|
Ma quindi è scorretto inizializzare una stringa con la sintassi
nome2="Pippo"; nel bel mezzo del main()?
__________________
Webmaster a tempo perso ![]() |
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 783
|
Quote:
![]() Poi la cosa che piu mi ha turbato è stato che nella dichiarazione di variabili posso fare cosi Codice:
char *nome=Giovanni; char nome2[10]=Marco;
__________________
"May the wind always be at your back and the sun upon your face. And may the wings of destiny carry you aloft to dance with the stars...." |
|
![]() |
![]() |
![]() |
#8 | |
Member
Iscritto dal: Aug 2004
Città: Modena
Messaggi: 96
|
Quote:
intendi dichiarazione di varabili globali?
__________________
Webmaster a tempo perso ![]() |
|
![]() |
![]() |
![]() |
#9 | |
Member
Iscritto dal: Aug 2004
Città: Modena
Messaggi: 96
|
Quote:
*Scusate il doppio post, ho avuto un momento di disconnessione col browser *
__________________
Webmaster a tempo perso ![]() |
|
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
scanf("%s",&nome1);
C'è un errore in questa scanf ![]() |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 783
|
No, semplici variaibli all'interno del main o altre funzioni
Intendi il doppio punto e virgola? Se è cosi non è quello l'errore perche anche cosi continua a darmi lo stesso errore: Codice:
#include <stdio.h> #include <stdlib.h> int main(void) { char nome1[10]; char nome2[10] = "Giacomo"; printf("Inserisci un nome: "); scanf("%s",&nome1); nome2="Giovanni"; printf("Nome inserito %s e secondo %s\n",nome1,nome2); system("PAUSE"); return 1; } Codice:
main.cpp(11) : error C2440: '=' : cannot convert from 'const char [9]' to 'char [10]'
__________________
"May the wind always be at your back and the sun upon your face. And may the wings of destiny carry you aloft to dance with the stars...." |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
nome2="Giovanni";
Questo è un errore, serve strcpy, ma te l'avevano già detto. C'è un errore nella printf sopra. |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2776
|
Ma se avesse scritto:
Codice:
nome2="Giovanni\0"; Codice:
from 'const char [10]' to 'char [10]' E' solo curiosità, non ho il compilatore sotto mano per provare da solo... |
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
No...lo \0 è implicito nel caso comunque.
Il problema è che "Giovanni" è un char *, mentre nome2 è char[10]. Se nome2 era un puntatore allora funzionava. In ogni caso sempre meglio allocare lo spazio ed usare strcpy. |
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2776
|
Scusa ma non ho capito, probabilmente mi manca qualche nozione importante...
Perché "Giovanni" è char*? Non dovrebbe essere const char[9]? E nome2 non è comunque un puntatore al primo dei dieci char in fila? Scusa anche se dico cazzate ma sono un po' a digiuno di C/C++ |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Mar 2007
Messaggi: 384
|
a pensarci bene cionci non ha tutti i torti: quando si dichiara un'array di puntatori a carattere l'inizializzazione viene fatta proprio con i puntatori
![]() Codice:
char*vet[3]={"str1","stringa1",str2"}; quando si ricorre all'allocazione normale si ottiene il risultato che tutti conosciamo per una semplice coincidenza.... si è spiegato così l'errore di salvodel: non si può allocare memoria statica in maniera così spartana (pignolo xò il c++) però non capisco: quando ho una funzione e gli passo una stringa essa la vede come costante caratteri (intnedo in fase di scrittura del codice, non runtime), cos'è casting implicito? |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Diciamo che i char literal hanno un comportamento un po' particolare.
In generale sono char *... char s[] = "ciao"; si può fare, ma in realtà ha un significato particolare in quanto si va a prendere "ciao" e lo si copia in s (la dimensione di s viene presa automaticamente). La stessa cosa avviene con i parametri literal: void f(char s[10]); f("ciao"); è perfettamente concesso. Non è concessa questa assegnazione: char s[10]; char *s2; s = s2; in quanto c'è differenza fra s e s2. s è considerato a tutti gli effetti una "struttura" di 10 char di cui il puntatore al primo elemento non è modificale. E' invece concessa questa: char *s2 = s; In quanto s2 va a puntare il primo elemento del vettore. Non a caso se si fa sizeof di un vettore allocato staticamente si ottiene la dimensione del vettore. Se si fa sizeof di un vettore allocato dinamicamente si ottiene |
![]() |
![]() |
![]() |
#18 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
E come fare: char *s = "ciao"; char s[] = "ciao"; |
|
![]() |
![]() |
![]() |
#19 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2776
|
Adesso ho capito, grazie per la spiegazione
![]() |
![]() |
![]() |
![]() |
#20 | |
Senior Member
Iscritto dal: Dec 2004
Messaggi: 783
|
Quote:
Una cosa: prima mi avevi datto che c'era un errore nella scanf ed ora nella printf ma se non faccio l'assegnazione sbagliata nome2="Giovanni"; il programmone ![]() Grazie mille di nuovo per le utili spiegazini. Ciao
__________________
"May the wind always be at your back and the sun upon your face. And may the wings of destiny carry you aloft to dance with the stars...." |
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:15.