Discussione:
Eliminare carattere da stringa (fget) e scanf
(troppo vecchio per rispondere)
mattia
2003-12-15 15:22:24 UTC
Permalink
Salve, come posso eliminare l'ultimo carattere (che presumo sia \0 ) da una
stringa ottenuta con un fget, in modo che quando vado a stampare quella
variabile su un file con fprintf non mi manda di una riga a capo?

Inoltre volendo non utilizzare lo scanf e quindi adoperare "gets", come
posso leggere delle variabili di tipo intero? Sorge questo problema, poichè
se tento di utilizzare contemporaneamente scanf e gets, sorgono dei
problemi...

Grazie!
gsx
2003-12-15 15:40:25 UTC
Permalink
Post by mattia
Salve, come posso eliminare l'ultimo carattere (che presumo sia \0 ) da una
stringa ottenuta con un fget, in modo che quando vado a stampare quella
variabile su un file con fprintf non mi manda di una riga a capo?
Inoltre volendo non utilizzare lo scanf e quindi adoperare "gets", come
posso leggere delle variabili di tipo intero? Sorge questo problema, poichè
se tento di utilizzare contemporaneamente scanf e gets, sorgono dei
problemi...
1) text[ strlen(text) - 1 ] = 0;

2) puoi usare gets() e poi sscanf() sulla stringa ottenuta con
gets()

Ciao
E.
Andrea Laforgia
2003-12-17 08:12:10 UTC
Permalink
Post by gsx
1) text[ strlen(text) - 1 ] = 0;
Non va bene questa tecnica, in generale. L'ultimo carattere letto da
fgets() potrebbe anche non essere '\n'.
Post by gsx
2) puoi usare gets() e poi sscanf() sulla stringa ottenuta con
gets()
Mai usare gets(), nè qualsiasi derivato di scanf(), a meno di non sapere
*esattamente* che cosa si sta facendo.
--
questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad ***@newsland.it
gsx
2003-12-17 11:23:25 UTC
Permalink
Post by Andrea Laforgia
Post by gsx
1) text[ strlen(text) - 1 ] = 0;
Non va bene questa tecnica, in generale. L'ultimo carattere letto da
fgets() potrebbe anche non essere '\n'.
Si', era solo una risposta tecnica alla domanda su come rimuovere l'ultimo
carattere.
La tua precisazione e' senz'altro utile e opportuna.
Post by Andrea Laforgia
Post by gsx
2) puoi usare gets() e poi sscanf() sulla stringa ottenuta con
gets()
Mai usare gets(), nè qualsiasi derivato di scanf(), a meno di non sapere
*esattamente* che cosa si sta facendo.
Anche qui era solo un modo per consentire l'uso conbinato di gets() e
scanf().
Pero' non sapevo che fosse sconsigliabile sscanf(),
sapevo solo di dover stare attento a scanf().
Io in questi casi uso fgets() su stdin , ma poi uso sscanf(),
perche' e' pericoloso ?
L'alternativa, se non sbaglio, e' fare tutto a mano, o no ?
Di solito faccio a mano solo quando devo spostare il puntatore,
per esempio dopo un numero o un nome.

Grazie
Ciao
E.
Andrea Laforgia
2003-12-17 13:21:14 UTC
Permalink
Post by gsx
Anche qui era solo un modo per consentire l'uso conbinato di gets() e
scanf().
Mai usare gets() e scanf() in modo combinato.
Post by gsx
Io in questi casi uso fgets() su stdin , ma poi uso sscanf(),
perche' e' pericoloso ?
In questo caso non ci vedo un particolare pericolo, ma in generale le
*scanf() sono sconsigliabili perché non hanno controlli sulla lunghezza
del campo da memorizzare.
--
questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad ***@newsland.it
gsx
2003-12-17 16:10:02 UTC
Permalink
Post by Andrea Laforgia
Post by gsx
Anche qui era solo un modo per consentire l'uso conbinato di gets() e
scanf().
Mai usare gets() e scanf() in modo combinato.
Post by gsx
Io in questi casi uso fgets() su stdin , ma poi uso sscanf(),
perche' e' pericoloso ?
In questo caso non ci vedo un particolare pericolo, ma in generale le
*scanf() sono sconsigliabili perché non hanno controlli sulla lunghezza
del campo da memorizzare.
Capito !
Grazie
Ciao
E.
Giorgio Pastore
2003-12-18 22:11:42 UTC
Permalink
Andrea Laforgia wrote:
...
Post by Andrea Laforgia
In questo caso non ci vedo un particolare pericolo, ma in generale le
*scanf() sono sconsigliabili perché non hanno controlli sulla lunghezza
del campo da memorizzare.
Immagino che ti riferisca alla lettura di stringhe. Ma questo e' vero
solo se leggi col convertitore %s senza specificare il campo max. Se
invece ce lo aggiungi (p.es. %80s ) il controllo lo hai.

Giorgio
Andrea Laforgia
2003-12-19 07:54:38 UTC
Permalink
Post by Giorgio Pastore
Immagino che ti riferisca alla lettura di stringhe. Ma questo e' vero
solo se leggi col convertitore %s senza specificare il campo max. Se
invece ce lo aggiungi (p.es. %80s ) il controllo lo hai.
Molto meglio ricorrere a fgets() in tutti i casi.
--
questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad ***@newsland.it
Angelo Paolitto
2003-12-15 16:26:19 UTC
Permalink
Post by mattia
Inoltre volendo non utilizzare lo scanf e quindi adoperare "gets", come
gets() andrebbe evitata come la peste: troppo alta la probabilita' di
mandare a puttane il programma.
Post by mattia
posso leggere delle variabili di tipo intero?
A manina. Controlli che i caratteri immessi costituiscano un intero
valido (es. aiutandoti con strtol() per gli interi e strtod() per i
double)
Post by mattia
... Sorge questo problema, poichè
se tento di utilizzare contemporaneamente scanf e gets, sorgono dei
problemi...
??? gets() da parecchi problemi se la quantita' di testo immesso supera
la dimensione del buffer a disposizione, non solo con scanf().
Cosa ti e' capitato?

C:\>iao Angelo
--
Posted via Mailgate.ORG Server - http://www.Mailgate.ORG
Andrea Laforgia
2003-12-17 08:10:41 UTC
Permalink
Salve, come posso eliminare l'ultimo carattere (che presumo sia ) da una
stringa ottenuta con un fget, in modo che quando vado a stampare quella
variabile su un file con fprintf non mi manda di una riga a capo?
L'ultimo carattere letto da fgets(), a meno di non riempire il buffer di
lettura, è '\n', non '\0'. L'unico modo per eliminarlo è quello di
sostituirlo con '\0'.

(non l'ho compilato):

#include <stdio.h>

int main()
{
char s[50];

if (fgets(s, sizeof(s), stdin))
{
int i;
for (i = 0; s[i]; i++)
{
if (s[i] == '\n') s[i] = '\0';
}
}
}
--
questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad ***@newsland.it
mattia
2003-12-17 14:00:39 UTC
Permalink
Questo codice non va .. mi da incompatible type in assignment
(uso dev c++)

Ho risolto con
d[i][(strlen(d[i])-1)] = '\0';

Dove d è un'array bidimensionale.
Rimane il problema del gets e scanf...come li combino? non ancora ho capito
cosa fa bene sscanf ...
Post by Andrea Laforgia
Salve, come posso eliminare l'ultimo carattere (che presumo sia ) da una
stringa ottenuta con un fget, in modo che quando vado a stampare quella
variabile su un file con fprintf non mi manda di una riga a capo?
L'ultimo carattere letto da fgets(), a meno di non riempire il buffer di
lettura, è '\n', non '\0'. L'unico modo per eliminarlo è quello di
sostituirlo con '\0'.
#include <stdio.h>
int main()
{
char s[50];
if (fgets(s, sizeof(s), stdin))
{
int i;
for (i = 0; s[i]; i++)
{
if (s[i] == '\n') s[i] = '\0';
}
}
}
--
questo articolo e` stato inviato via web dal servizio gratuito
Andrea Laforgia
2003-12-17 15:09:14 UTC
Permalink
Post by mattia
Ho risolto con
d[i][(strlen(d[i])-1)] = '';
Questo codice fa un'assunzione errata e cioè che l'ultimo carattere
memorizzato da fgets() sia sempre '\n', cosa che può benissimo non essere
vera. Il mio codice dovrebbe compilare tranquillamente, su che riga ti da
errore ? purtroppo qui in ufficio non ho un compilatore C con cui
verificare. Dovrebbe essere banale correggere l'errore.
--
questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad ***@newsland.it
mattia
2003-12-17 15:40:17 UTC
Permalink
Il codice da solo non da errore..infatti l'ho modificato a mio piacimento
:-p
Cosa vuol dire if (fgets(s, sizeof(s), stdin)) ?

cmq può andare
if (d[i][(strlen(d[i])-1)] == '\n') d[i][(strlen(d[i])-1)] = '\0';
?

Altra domanda. come dichiaro le valori di un array di string?

ho provato con s[0] = { "prova" };

ma non va...
Post by Andrea Laforgia
Post by mattia
Ho risolto con
d[i][(strlen(d[i])-1)] = '';
Questo codice fa un'assunzione errata e cioè che l'ultimo carattere
memorizzato da fgets() sia sempre '\n', cosa che può benissimo non essere
vera. Il mio codice dovrebbe compilare tranquillamente, su che riga ti da
errore ? purtroppo qui in ufficio non ho un compilatore C con cui
verificare. Dovrebbe essere banale correggere l'errore.
--
questo articolo e` stato inviato via web dal servizio gratuito
Andrea Laforgia
2003-12-18 13:16:24 UTC
Permalink
Post by mattia
Il codice da solo non da errore..
infatti l'ho modificato a mio piacimento
??
Post by mattia
Cosa vuol dire if (fgets(s, sizeof(s), stdin)) ?
E' l'istruzione per leggere la stringa... è fondamentale, all'interno di
quel codice. Ma un manuale del linguaggio proprio no, eh ?
Post by mattia
cmq può andare
if (d[i][(strlen(d[i])-1)] == 'n') d[i][(strlen(d[i])-1)] = '';
?
No.
--
questo articolo e` stato inviato via web dal servizio gratuito
http://www.newsland.it/news segnala gli abusi ad ***@newsland.it
Loading...