|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Mar 2004
Città: Novara
Messaggi: 358
|
[C]Principiante: domande sulle strinche
allora ho iniziato a programmare in C per l'esame di algoritmi in università, ora io provengo da java (esame di programmazione 1, quindi so giusto lessenziale).
ora ho dei grossi problemi, java mi sembra + frendly come approccio (una volta capita la filosogia a oggetti) mi ritrovo bloccato ad esempio a non capire come si costruisce una stringa, il tipo String esiste?? ho letto che una stringa è un array di caratteri e mi riferisco a lei con un puntatore (anche qui molti dubbi), come faccio a fare una funzione leggi strnga?? ho provato così, ma non funziona (non insultatemi sicuramente ci sono delle grosse boiate) #include <stdio.h> char *leggiStringa(void){ int i =0; char c, stringa[50]; c = getChar(); while(c!='\n'){ stringa[i] = c; c = getChar(); i++; } return *stringa; } mi dite che cosa sbaglio? e soprattutto come si gestiscono le stringhe??? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
se vuoi inserire carattere per carattere devi anche ricordarti di mettere il catattere di fine stringa.
char stringa [10]; gets (stringa); ->prendi una stringa puts (stringa); ->leggi una stringa ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
Il primo errore del tuo programma sta nel fatto di ritornare *stringa: questo indica un carattere mentre tu hai dichairato di ritornare un puntatore a carattere. Quindi devi ritornare stringa e non *stringa. Pero la variabile stringa non puo essere dichiarata localmente perche all'uscita dalla funzione, stringa, essendo una variabile locale, viene distrutta e il puntatore punterà ad una locazione senza significato. Una soluzione sta nel dichiarare stringa come variabile globale o nel passarla come parametro di leggistringa. Inoltre si scrive getchar e non getChar; infine se vuoi leggere una stringa:
char *stringa; scanf("%s", stringa); In c le stringhe non sono Object come java, ma sono degli array di caratteri. A loro volta, gli array altro non sono che dei puntatori al primo elemento dell'array stesso. Quindi una stringa la dichiari semplicemente come un puntatore a char. La tua variabile stringa è difatti un opuntatore al primo char della stringa stessa.
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Mar 2004
Città: Novara
Messaggi: 358
|
se è come dici, allora perchè mi da errore sulla printf???
Codice:
#include <stdio.h> int main(void){ char *stringa1 ="questa è la prima stringa (costante) \n"; char *stringa2 =""; scanf("%s",stringa2) printf("%s\n%s\n\n fine",stringa1,stringa2); return 0; } |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
se usi i puntatori ti tocca allocare lo spazio ... con il puntatore non fai niente
#include <stdio.h> #include <conio.h> void main () { char stringa[10]; printf ("Inserisci stringa:"); gets (stringa); printf ("La stringa inserita è: %s", stringa); } ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso Ultima modifica di Fenomeno85 : 30-03-2004 alle 19:03. |
![]() |
![]() |
![]() |
#6 | |
Senior Member
Iscritto dal: Mar 2004
Città: Novara
Messaggi: 358
|
Quote:
|
|
![]() |
![]() |
![]() |
#7 | |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
Quote:
char stringa[10]; stringa è anche il puntatore ![]() ma se dichiari un puntatore ... devi anche allocare dello spazio ... se non mi ricordo male era con malloc ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
![]() |
![]() |
![]() |
#8 | |
Senior Member
Iscritto dal: Mar 2004
Città: Novara
Messaggi: 358
|
Quote:
|
|
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
se dichiari l'array allochi già lo spazio
![]() ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Mar 2004
Città: Novara
Messaggi: 358
|
Codice:
#include <stdio.h> #define MAX_STRING 50 int main(void){ char *stringa1 ="questa è la prima stringa (costante) \n"; char stringa2[MAX_STRING] ; scanf("%s",stringa2) printf("%s\n%s\n\n fine",stringa1,stringa2); return 0; } |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
te lo detto che non funziona quell'esempio .. se provi il mio funzega
~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Mar 2004
Città: Novara
Messaggi: 358
|
Quote:
quindi ogni volta che creo una stringa devo definire un array e quindi una grandezza (con una macro) giusto? |
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Oct 2000
Messaggi: 417
|
Nel C le stringhe non sono un tipo di dato base e sono gestite come vettore di caratteri. Nell C++ invece esistono i dati di tipo string.
Una costante stringa può essere definita al tempo di compilazione mediante la direttiva #define NOME_STRINGA "stringa" Ad esempio: #define stringa1 "Questa è la prima stringa (costante)" Oppure al tempo di esecuzione nel seguente modo: void main() { const char stringa1[]="Questa è la prima stringa (costante)" ..... } La dichiarazione di una variabile avviene soltanto al tempo di esecuzione secondo il seguente formato: void main() { char stringa1[]="Questa è la prima stringa (costante)" ..... } Se vuoi inserire da tastiera una stringa è obbligatorio specificarne la grandezza massima dimensionando quindi il vettore di caratteri. La dichiarazione di una variabile stringa dimensionata avviene nei seguenti modi: 1. #define GRANDEZZA_MASSIMA 51 (devi aggiungere 1 al totale perchè il C alla fine di una stringa aggiunge in automatico il carattere di null \0) void main() { char stringa1[GRANDEZZA_MASSIMA] ..... } 2. void main() { const int GRANDEZZA_MASSIMA=51 char stringa1[GRANDEZZA_MASSIMA] ..... } 3. void main() { char stringa1[51] ..... } La dichiarazione di una costante stringa dimensionata avviene allo stesso modo delle variabili ma anteponendo const davanti char stringa1...... |
![]() |
![]() |
![]() |
#14 | |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
![]() char *stringa; .... .... stringa = (char *) malloc (sizeof(char)*dim); scanf("%s", stringa); .... .... .... free(stringa); oppure char stringa[256]; scanf("%s", stringa); Il secondo metodo si usa quando sappiamo a priori la dimensione della stringa da allocare...il primo quando la dimensione viene determinata in fase di esecuzione (ed allocata con malloc)... Ma il metodo che preferisco è questo... Usare un qualsiasi tipo di allocazione sopra con la dimensione pari a DIM ed una lettura di questo tipo: fgets(stringa, DIM-1, stdin); /*ora bisogna togliere l'ultimo carattere se è uno \n*/ (stringa[strlen(stringa)-1] == '\n') ? (stringa[strlen(stringa)-1] = '\0') : 0; oppure in maniera + leggibile: int last; .... .... fgets(stringa, DIM-1, stdin); /*ora bisogna togliere l'ultimo carattere se è uno \n*/ last = strlen(stringa)-1; if(stringa[last] == '\n') stringa[last] =='\0'; fgets evita uno dei pericoli maggiori per i nostri programmi (e per i nostri sistemi operativi)...il buffer overflow ![]() Ultima modifica di cionci : 31-03-2004 alle 10:04. |
|
![]() |
![]() |
![]() |
#15 |
Senior Member
Iscritto dal: Sep 2003
Città: Milano
Messaggi: 4623
|
grazie mille alla professionalità di cionci, ma ripeto che sono un principiante e dei tuoi codici non ci capisco un granchè.... eh eh, cmq quello che ho capito è che bisogna allocare lo spazio in fase di comilazione per un array (per me che sono un principiante) e poi gestirlo a piacere come array o puntatore.
__________________
Ho trattato con : lahiri, czame, RC, allXXX, dfruggeri, JMM, Paperone, xej, Pappez, iperfly, Red81, Playmake, ryan78, Rob66, XP2200, Peach1200, faberjack, Stewie82, supermario_bros, hft500, Axelscorpio, pipes lee, Piccolospazio, RohanKish, miki66, kabira85 |
![]() |
![]() |
![]() |
#16 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Vabbè...limitati a questi:
Codice:
char *stringa; .... .... stringa = (char *) malloc (sizeof(char)*dim); scanf("%s", stringa); .... .... .... free(stringa); oppure char stringa[256]; scanf("%s", stringa); |
![]() |
![]() |
![]() |
#17 |
Senior Member
Iscritto dal: Sep 2003
Città: Milano
Messaggi: 4623
|
non so cosa sia malloc ne free... eh eh
__________________
Ho trattato con : lahiri, czame, RC, allXXX, dfruggeri, JMM, Paperone, xej, Pappez, iperfly, Red81, Playmake, ryan78, Rob66, XP2200, Peach1200, faberjack, Stewie82, supermario_bros, hft500, Axelscorpio, pipes lee, Piccolospazio, RohanKish, miki66, kabira85 |
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
malloc alloca memoria (un numero di byte pari alla dimensione passata come parametro) e ritorna un puntatore a void...poi modificato tramite un cast, leggi conversione, esplicita...
free libera la memoria alloca da malloc... |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:00.