PDA

View Full Version : [C] dubbi su un programmino per i/o stringhe


Cecco BS
03-06-2005, 12:49
Ho scritto questo programmino che prende in input delle stringhe e le stampa quando si è terminato. L'acquisizione delle stringhe termina quando si digita un carattere vuoto.

Eccolo:


#include <stdio.h>

int main()
{
int t, i;
char stringa[100][80];
printf("Digita le stringhe: \n\n");
for(t=0;t<100;t++) {
printf("Stringa %d: ", t);
gets(stringa[t]);
if(!*stringa[t]) break; // ecco la riga incriminata
}
printf("\n");
for(i=0;i<t;i++) printf("%s\n", stringa[i]);
system("pause");
}


il punto è che la prima volta l'avevo scritto senza l'asterisco e non andava, mi stampava valori assurdi e simboli strani... poi ho controllato sul manuale che sto seguendo e lì mette un asterisco, con il quale effettivamente il programma funziona...
...
...so che quell'asterisco indica un puntatore, ma non ho ancora affrontato l'argomento, quindi non so esattamente cosa voglia dire...
..il punto è che non vedo perchè non funziona senza asterisco: !stringa[t] dovrebbe - in caso la stringa fosse 0 - porre il valore a 1, e quindi svolgere i ciclo if... come mai non lo fa?

Ziosilvio
03-06-2005, 13:16
gets(stringa[t]);
Qualsiasi manuale di programmazione un minimo recente parla di quanto sia pericolosa gets.
Usa fgets.
la prima volta l'avevo scritto senza l'asterisco e non andava, mi stampava valori assurdi e simboli strani... poi ho controllato sul manuale che sto seguendo e lì mette un asterisco, con il quale effettivamente il programma funziona
Allora: stringa è un array di 100 array da 80 char ciascuno: stringa è il nome di una posizione nella memoria, chiamiamola X, che non è 0 perché la memoria all'indirizzo 0 non può e non deve essere allocata; di conseguenza, stringa[i][j] è un nome per la posizione X+100i+j, nessuna delle quali è 0.
Perciò, se fai il confronto su stringa[t], ottieni sicuramente un valore diverso da 0; se invece lo fai su *stringa[t] (che peraltro è lo stesso che stringa[t][0]), allora ottieni 0 se e solo se hai dato in input una stringa vuota.
so che quell'asterisco indica un puntatore, ma non ho ancora affrontato l'argomento, quindi non so esattamente cosa voglia dire
Allora ti conviene affrontarlo il più presto possibile.

Cecco BS
03-06-2005, 20:56
Qualsiasi manuale di programmazione un minimo recente parla di quanto sia pericolosa gets.
Usa fgets.


effettivamente il manuale che sto seguendo è del 1988 assieme ad un kernighan e ritchie del 1989 (seconda edizione!!!)!! Grazie del suggerimento...
...
....allroa vedrò di approfondire la questione dei puntatori! Grazie dei sgguerimenti! ;)

Fenomeno85
03-06-2005, 21:08
prova a scaricarti qualche manuale nuovo ;)

~§~ Sempre E Solo Lei ~§~

Cecco BS
03-06-2005, 21:44
prova a scaricarti qualche manuale nuovo ;)

~§~ Sempre E Solo Lei ~§~

uso questi semplicemente perchè ce li ho già belli pronti stampati... preferisco seguire un manuale cartaceo perchè così gli posso dare un occhiata anche quando sono in giro...

Ziosilvio
05-06-2005, 00:18
il manuale che sto seguendo è del 1988 assieme ad un kernighan e ritchie del 1989 (seconda edizione!!!)
Il K&R è ancora il punto di riferimento quando si parla di C standard ANSI --- standard che peraltro è stato fissato nel 1989, quindi l'altro tuo manuale potrebbe essere addirittura troppo vecchio.

Cecco BS
05-06-2005, 11:04
il manuale che ho io si riferisce appunto all'ANSI C, è l'edizione corretta secondo questo standard!