|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#21 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
La seconda che hai detto
|
|
|
|
|
|
#22 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
la seconda; non si possono inizializzare i membri delle struct, almeno non mi sembra, e comunque sicuramente non con i risultati di una funzione.
aridaje, preceduto un'altra volta questa volta non di poco però; mi sa che non mi ero accorto che avevi già scritto |
|
|
|
|
|
#23 |
|
Member
Iscritto dal: Jun 2005
Messaggi: 99
|
Capisco capisco..
Però come mai in un programma del genere anche se non alloco memoria funziona lo stesso? Codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void stampa(char **secondo){
char *pippo;
pippo = "Puntatore di puntatore";
*secondo = pippo;
return;
}
char * stampa2(){
char *pippo;
pippo = "Return puntatore a caratteri";
return pippo;
}
void stampa3(char *primo){
char *secondo;
secondo = primo;
printf("Stampa secondo stringa interna: %s\n\n", secondo);
return;
}
int main(void)
{
char *primo = "Assegnazione interna alla main";
char *secondo = NULL;
char *primo_funz = "secondo = primo";
//Assegnazione interna alla main
secondo = primo;
printf("%s\n\n", secondo);
//Puntatore di puntatore
stampa(&secondo);
printf("%s\n\n", secondo);
//Return puntatore a caratteri
secondo = stampa2();
printf("%s\n\n", secondo);
stampa3(primo_funz);
system("PAUSE");
return 0;
}
|
|
|
|
|
|
#24 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Perchè le stringhe dichiarate in questo modo sono a tutti gli effetti variabili allocate in memoria: "Assegnazione interna alla main"
Di conseguenza gli scambi fra puntatori che lavorano su queste variabili hanno successo...prova a modifcarle In ogni caso le variabili di questo tipo vengono allocate tutte (non obbligatoriamente, ma in molti compilatori avviene) all'inizio del programma e di conseguenza, seppure quello che hai fatto è scorretto dal punto di vista del C, nonostante tutto funziona... Prova a farci qualche operazione come strcat o strcpy e poi fammi sapere PS: un'assegnazione come questa: char *s = "Pippo"; non è di per se scorretta... Diventa scorretta se vai a modificare la stringa puntata da s o l'indirizzo di "pippo" va a finire nella parte di programma che ha chiamato la funzione che ha definito "pippo"... Ultima modifica di cionci : 22-09-2005 alle 08:26. |
|
|
|
|
|
#25 |
|
Member
Iscritto dal: Jun 2005
Messaggi: 99
|
Ah ok, quindi diciamo che è un'agevolazione che offre il compilatore!!! Accidenti, ha contribuito solo a confodermi di più le idee allora...
Ok, ora io ho allocato le variabili dinamiche in questo modo: char *stringa1 = (char *)malloc(NUMERO_CARATTERI); Mentre quelle statiche così: char stringa[NUMERO_CARATTERI]; Devo aggiungere qualcos'altro? Cioè, l'allocazione è giusta o prima di inizializzarle devo aggiungere qualcos'altro? Dopo queste istruzioni posso chiedere dati in ingresso giusto? Es. scanf("%s", stringa1); scanf("%s", stringa2); O prima devo fare qualche inizializzazione particolare??? Altre cose che non riesco a spiegarmi è come mai la funzione "gets" a volte prende dati, a volte invece salta direttamente all'istruzione successiva (come se lei non esistesse). La funzione gets posso usarla sia per stringhe statiche che per quelle dinamiche? E posso usarla con stringhe incorporate in strutture e in liste? Es. gets(lista->strutturaDati.stringa) Perchè ho sempre lo stesso problema... non mi chiede di inserire i dati e il programma salta direttamente all'istruzione successiva. Ultima cosa è come mai se ho una stringa allocata staticamente e le assegno dei caratteri, non posso fare lo stesso anche per le stringhe allocate staticamente nelle strutture? Es. struct struttura{ char stringa2[10]; }; struct struttura laStruttura; char stringa1[10] = "pippo"; //OK laStruttura.stringa2 = "pippo"; //ERRORE DEL COMPILATORE Ciauz Ultima modifica di pumax84 : 22-09-2005 alle 08:44. |
|
|
|
|
|
#26 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Giusto per l'allocazione...comunque dichiara prima i puntatori, ma la malloc falla solo dopo la dichiarazione di tutte le varaibili, questo perchè la malloc non viene considerata come una inizializzazione, ma come una istruzione vera e propria... Quindi soprattutto se i tuoi prof sono puristi del C non fare in questo modo (in teoria è giusto, perchè l'ultimo standard del C prevede la possibilità di dichiarare variabili in qualsiasi punto del programma)...
Per la gets... Per leggere le stringhe usa sempre fgets e non gets, perchè la fgets limita il numero di caratteri in input ad un cifra scelta da te, mentre la gets no...quindi può portare a problemi di buffer overflow... Molti professori testano gli input a bastardi per vedere se hai fatto proprio questi piccoli controlli... Riguardo al fatto che ti salta le gets: la scanf di default legge lo stream per assegnarlo ad una variabile a partire dal primo carattere diverso da quelli di spazio fino al primo carattere considerato fra quelli di spazio (ivi compreso \n), ma il carattere viene lasciato nello stream, mentre la gets lavora fino al primo \n rimuovendolo dallo stream...quindi puoi ben capire che se fai una scanf prima di una gets la gets trova subito lo \n... Comunque si puoi configurare la scanf per leggere le stringhe fino allo \n... In ogni caso ti conviene svuotare lo stream prima di ogni gets o fgets con fflush(stdin); Attenzione che fflush ha un comportamento non standard per tutte le console... |
|
|
|
|
|
#27 | |||
|
Member
Iscritto dal: Jun 2005
Messaggi: 99
|
Quote:
Quote:
Quote:
Es. char return; char *stringa1, *stringa2; //malloc eccecc ... ... scanf("%s", stringa1); scanf("%c", &return); ... ... gets(stringa2); Ora sto finendo di fare il debug al programmino d'esame, sono arrivato all'ultimo, ho corretto quasi tutti gli errori, grazie a te! Ciauz |
|||
|
|
|
|
|
#28 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Te l'avevo scritto qualche post fa come si usa...
Io userei la fflush...altrimenti puoi leggere le stringhe anche con la scanf... scanf("%[\n]s", stringa); ma soffre dello stesso problema di gets sulla lunghezza della stringa... |
|
|
|
|
|
#29 | |
|
Member
Iscritto dal: Jun 2005
Messaggi: 99
|
Quote:
Il programma l'ho completato ed è privo di errori, grazie di tutto! Alla prossima... Ciauz |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 16:20.



















