Newsgroup: it.comp.lang.c
Titolo: ancora sulla gets

Ciao.
Sul libro trovo scritto a proposito della funzione gets:
Prototipo della funzione:
char *gets(char *s)
Descrizione della funzione:
Legge i caratteri dallo standard input e li immagazzina nel vettore
s,
finché non incontra un carattere newline o un indicatore di fine del
file. Alla fine del vettore sarà accodato un carattere NULL di
terminazione.
Ciò che non mi è chiaro è: che significa "finché non incontra un
indicatore di fine del file" ?... io sono convinto del fatto che si
utilizza la funzione gets quando si vuole memorizzare in una certa
variabile dati immessi da tastiera.
Diverso è il caso della fgets, caso in cui in effetti il "finché non
incontra un indicatore di fine del file" assume un preciso
significato.
Ciao e grazie


Ragionandoci un po' su penso che per "fine del file" si intenda EOF,
<ctrl - z> in ambinente DOS WINDOWS.
Sorge un altro problema: nella pagina web 
http://www.swprog.com/guide/c-input.php
leggo a proposito della gets :
"Restituisce la sequenza di caratteri letta, priva del carattere
newline o di EOF"
Peccato che il seguente mio esempio
#include <stdlib.h>
#include <stdio.h>
int main()
{
    char *l_pStr;
    l_pStr = new char[100];
    if (l_pStr) {
    printf("Inserire una stringa, (gli spazi sono ammessi):\n");
    gets(l_pStr);
    printf("La stringa immessa e': %s\n", l_pStr);
    delete(l_pStr);
    }
    system("pause");
    return 0;
}
produca il seguente output a run -time:
Inserire una stringa, (gli spazi sono ammessi):
Odio la pioggia^Zforte
La stringa immessa e': Odio la pioggia→
Premere un tasto per continuare . . .
Quello che non mi so spiegare è quella freccetta  " → " che appare.
Forse è dovuta al fatto che ho dovuto premere due volte enter.. ma poi
perché devo premere due volte enter... ma poi non era che la pagina
web sopra diceva che "Restituisce la sequenza di caratteri letta,
priva del carattere newline o di EOF"...
Aiuto!

 variabile dati immessi da tastiera.
No, usi gets quando vuoi leggere dati provenienti dallo standard input. 
Questo di solito è la tastiera, ma potrebbe anche essere un file.
E.

 priva del carattere newline o di EOF"...
Può darsi che quando premi ^Z venga anche inserito un carattere nello
stream di input oltre che mandare il terminatore EOF.
E.


nel caso di file uso fgets

 Pu¨° darsi che quando premi ^Z venga anche inserito un carattere nello


 printf("%d\n", '→');  produce come output 63
Anche 	printf("%d\n", '?'); produce come output 63 .... e menomale che
l'ASCII in quanto Code era una applicazione bigettiva...

 l'ASCII in quanto Code era una applicazione bigettiva...
ascii?
e da quando "RIGHTWARDS ARROW"[1] è presente nella tabella ascii?
[1] 
http://www.fileformat.info/info/unicode/char/2192/index.htm
-- 
By ZeD

 Come posso sfruttare questa informazione?
Se il codice incriminato fosse 26, allora dovresti accettare l'ipotesi 
seguente:


andrew ha scritto:

Ma tu non puoi sapere come verrà usato il tuo programma. Se me lo dai, 
io posso benissimo passargli l'input da file. In tal caso il tuo 
programma, con il comando gets, leggerà un file.
E.


benissimo, non utilizzerò più la gets ma la fgets con la sintassi
fgets(sentence, 1000000, stdin); <==> gets(sentence);

 - Mostra testo citato -

     ?
No, mi pare di aver scritto bene. L'hai provato?
E.


Si ma non ho mai trovato un for senza il primo argomento dei tre
previsti.
Ho pensato a quale argomento potesse sottointendere l'assenza di
argomento ma non riesco.
Potresti scrivermelo per esteso senza sottointendere il primo
argomento?

 - Mostra testo citato -
L'output col tuo codice inserito è questo:
http://i34.tinypic.com/r0uy36.png
.. tra parentesi adesso la freccina è l'ASCII 26
Il punto è che secondo me il problema sta nel fatto che quando ho
digitato l'ultima lettera e digito enter, bene devo ripigiare di nuovo
enter sennò il programma non procede


Ho digitato da tastira la freccia, che è UNICODE e non ASCII.. si
tratta invero dell'ascii 26

 argomento?
Mi spiace ma ho l'impressione di stare perdendo il mio tempo.
E.

 enter sennò il programma non procede
Ma questo non è un problema del tuo programma, ma di come funziona la 
finestra DOS. Non puoi modificare questo comportamento.
E.

 - Mostra testo citato -
Non per fare polemica, ma forse mi sono spiegato male.
Vedi, quando di solito uso il for io scrivo
for (i=cond_ini; cond. di terminazione su i; incremento su i)
Tu invece hai saltato a piè pari la prima di queste tre condizioni.
Almeno spiegami perché credi di perdere tempo. Fidati, io sono in
buona fede, e credo che ci sia un fraintendimento

 - Mostra testo citato -
Credo anche che tu abbia da fare cose molto molto + difficili che
spiegare un po' di C di base. E sono serio.

 Mi spiace ma ho l'impressione di stare perdendo il mio tempo.
Scusa, ma non avevo visto l'altro messaggio... Se ti sei preso la briga 
di postare uno screenshot vuol dire che la cosa ti interessa...
Dunque il codice:
for(expr1; expr2; expr3) {
    expr4;
}
è equivalente a
expr1;
while(expr2) {
   expr4;
   expr3;
}
dunque
for(;*s;s++) {
   //...
}
è equivalente a
while(*s) {
   // ...
   s++;
}
La variabile s è già inizializzata correttamente per l'esecuzione del 
ciclo. All'entrata della funzione s punta al primo carattere della 
stringa da stampare.
E.


Ecco, io ho provato a pensare ad esplicitare questa variabile
implicita ma non ci sono riuscito. se tu potessi aiutarmi mi farebbe
piacere.
Poi, per concludere,
noto che
quanto abbiamo osservato è in conclusione in contraddizione con quanto
di cui nel 
http://www.swprog.com/guide/c-input.php#gets
in cui c'è scritto a proposito della funzione gets
"Restituisce la sequenza di caratteri letta, priva del carattere
newline o di EOF,"
Bah!
Grazie di tutto cmq

 Aiuto!
Comunque è normale che la gets non restituisca EOF.
La gets legge da stdin, che è un file, come indicato anche nella pagina
web che hai citato.
Il codice
char c[100];
gets(c);
è uguale al codice
char c[100];
fgets(c, 100, stdin);
Le due porzioni di codice hanno lo stesso effetto.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 newline o di EOF,"
Non è in contraddizione perché il carattere 26 non è l'EOF. 
Semplicemente quando scrivi su una finestra DOS hanno deciso che se 
premi ^Z (carattere 26) poi lo stream di input viene chiuso. Prova a 
mandare l'input al tuo programm in maniera diversa. Ad esempio prova:
echo "Odio la pioggia" | mioprogramma.exe
dove mioprogramma.exe è il nome del tuo eseguibile.
E.

 Amarok 1.4.10 is airing: Dio - Holy Diver [from: "Holy Diver"]
mi fai sorridere tetsuya