PDA

View Full Version : [C] scanf chiede due volte il valore - sostituta


gepeppe
27-10-2007, 11:58
salve a tutti, devo usare scanf per inserire da tastiera il percorso di un file, solo che dopo la prima chiamata tutto ok, ma alla seconda, anche se cambio la variabile dove memorizzare il valore di scanf devo inserirla due volte. cioè la prima volta faccio:

char primo[40];
char secondo[40];

scanf("%s", &primo);

altro codice....

scanf("%s", &secondo);


ma la seconda volta dopo che inserisco i lpercorso, si ferma e lo devo inserire di nuovo. perchè?? inoltre c'è una funzione sostitutiva di scanf per le stringh? perchè per i valori numerici singoli ho usato getch()

grazie

Alhazred
27-10-2007, 13:44
Probabilmente da fastidio la pressione di invio, prova a mettere un getchar(); dopo le scanf.

~=N30=~
27-10-2007, 13:45
salve a tutti, devo usare scanf per inserire da tastiera il percorso di un file, solo che dopo la prima chiamata tutto ok, ma alla seconda, anche se cambio la variabile dove memorizzare il valore di scanf devo inserirla due volte. cioè la prima volta faccio:

char primo[40];
char secondo[40];

scanf("%s", &primo);

altro codice....

scanf("%s", &secondo);


ma la seconda volta dopo che inserisco i lpercorso, si ferma e lo devo inserire di nuovo. perchè?? inoltre c'è una funzione sostitutiva di scanf per le stringh? perchè per i valori numerici singoli ho usato getch()

grazie

quale percorso? fatti capire meglio, fai un esempio di input e cosa succede

(ps: puoi nn mettere la & se stai trattando array)



altre funzioni al posto di scanf ci sono, prova ad utilizzare la fgets()

gepeppe
27-10-2007, 14:05
Probabilmente da fastidio la pressione di invio, prova a mettere un getchar(); dopo le scanf.
provato, non cambia nulla

quale percorso? fatti capire meglio, fai un esempio di input e cosa succede

(ps: puoi nn mettere la & se stai trattando array)

altre funzioni al posto di scanf ci sono, prova ad utilizzare la fgets()

nel senso che devo inserire in primo e secondo un percorso. Cioè a video esce inserisci il percorso del file, io scrivo c:\pippo.txt e viene memorizzato in primo..poi ci faccio alcune cose, tipo conto il numero di caratteri..poi esec a video, inserisci il file di output, io lo metto e con scanf dovrei averlo, solo che me lo chiede due volte...appunto

inoltre fgets() non ha bisogno di sapere qunti caratteri deve leggere? e se io non lo sapessi a priori?

71104
27-10-2007, 14:11
char primo[40];
char secondo[40];

scanf("%s", &primo);

altro codice....

scanf("%s", &secondo);

due errori nel tuo codice:
1) devi togliere il & perché i vettori vengono passati per puntatore
2) sei a rischio di buffer overflow (l'input potrebbe superare i 40 caratteri); usa questo format string: "%40s"

per quanto riguarda la funzione sostitutiva ti suggerirei la gets se non fosse che è deprecata perché non c'è rimedio al rischio di buffer overflow.

71104
27-10-2007, 14:14
2) sei a rischio di buffer overflow (l'input potrebbe superare i 40 caratteri); usa questo format string: "%40s" oddio ora che ci penso temo che sia errato anche quel format string, a causa di un off-by-one; dalla documentazione del man non si capisce bene se il campo "field width" prima di una conversione nel caso delle stringhe include il carattere di terminazione... per sicurezza potresti usare quest'altro format string: "%39s"

gepeppe
27-10-2007, 14:19
due errori nel tuo codice:
1) devi togliere il & perché i vettori vengono passati per puntatore
2) sei a rischio di buffer overflow (l'input potrebbe superare i 40 caratteri); usa questo format string: "%40s"

per quanto riguarda la funzione sostitutiva ti suggerirei la gets se non fosse che è deprecata perché non c'è rimedio al rischio di buffer overflow.

niente da fare...ho provato in tutti e due i modi, ma il problema non cambia!

devo usare allora una funzione che mi legge carattere per carattere fino a EOF con getc e metterne uno a uno nella stringa seconda!! uffa..stò scanf!!!!

ma se gli passo fgets(secondo, 100, stdin) e metto come n.caratteri 100 ma la parola e di 50 caratteri funziona lo stesso?

edit:
provato ma non funziona...fopen mi dice che non è corretto, cioè facendo cosi non trova il percorso!!

71104
27-10-2007, 14:19
oddio ora che ci penso temo che sia errato anche quel format string, a causa di un off-by-one; dalla documentazione del man non si capisce bene se il campo "field width" prima di una conversione nel caso delle stringhe include il carattere di terminazione... per sicurezza potresti usare quest'altro format string: "%39s" Microsoft conferma: il valore field width nel caso della conversione s non include il carattere NUL di terminazione.

e meno male che c'è Microsoft che vi aiuta a programmare meglio pure su Linux, alla faccia di tutti voi linuxisti anarchisti con quel maledetto pinguino storpio in avatar :asd:

gepeppe
27-10-2007, 14:25
Microsoft conferma: il valore field width nel caso della conversione s non include il carattere NUL di terminazione.

e meno male che c'è Microsoft che vi aiuta a programmare meglio pure su Linux, alla faccia di tutti voi linuxisti anarchisti con quel maledetto pinguino storpio in avatar :asd:

:mbe:

71104
27-10-2007, 14:31
:mbe: ah! anima candida, non sai nulla del dibattito Linux vs. Windows che scalda gli animi di mezzo mondo :D

k0nt3
27-10-2007, 14:32
Microsoft conferma: il valore field width nel caso della conversione s non include il carattere NUL di terminazione.

e meno male che c'è Microsoft che vi aiuta a programmare meglio pure su Linux, alla faccia di tutti voi linuxisti anarchisti con quel maledetto pinguino storpio in avatar :asd:
fortuna che non è vero http://www.rt.com/man/scanf.3.html :D
Matches a sequence of non-white-space characters;
the next pointer must be a pointer to char, and the
array must be large enough to accept all the
sequence and the terminating NUL character. The
input string stops at white space or at the maximum
field width, whichever occurs first.

gepeppe
27-10-2007, 14:37
si ma alla fine io cosa faccio cò stà scanf?

:cry:

71104
27-10-2007, 14:40
fortuna che non è vero http://www.rt.com/man/scanf.3.html :D è vero eccome; ho letto e riletto quella parte, e ancora non sono riuscito a capire se il valore numerico specificato nel format string includa il terminatore NUL o meno. mi spieghi cosa significa "The input string stops at the maximum field width" ??
molto più chiara MSDN invece, che fa un esempio di codice assolutamente inequivocabile:
char s[10];

scanf("%9s", s, 10);
http://msdn2.microsoft.com/en-us/library/w40768et(VS.80).aspx
:O :D


EDIT - avevo messo il link sbagliato; in realtà quella pagina non documenta proprio la scanf ma una funzione migliorata (più sicura) esclusiva del runtime di Visual C++, che vuole un ulteriore parametro che specifica la dimensione del buffer; infatti nel codice che ho scritto c'era un parametro di troppo, il 10 finale.

~=N30=~
27-10-2007, 14:42
quello della scanf e della lunghezza delle stringhe e' un problema senza soluzione (ho chiesto al prof di programmazione xke' ho avuto lo stesso problema)

puoi utilizzare una malloc e dei puntatori ma il problema resta

l'unica e' utilizzare una funzione diversa come quella che ti ho scritto prima

k0nt3
27-10-2007, 14:45
the array must be large enough to accept all the sequence and the terminating NUL character
più chiaro di così si muore :read:

strano che non funziona fgets.. prova a compilare un programma tipo questo:

#include <stdio.h>

int main(char* argv[], int argc)
{
char stringa[10];
fgets(stringa, 10, stdin);
printf("%s\n", stringa);
return 0;
}

funziona?

71104
27-10-2007, 14:49
quello della scanf e della lunghezza delle stringhe e' un problema senza soluzione (ho chiesto al prof di programmazione xke' ho avuto lo stesso problema) di' al tuo professore di ripassare: la scanf accetta nei format string un valore di "field width", che nel caso delle stringhe specifica la dimensione del buffer

puoi utilizzare una malloc e dei puntatori ma il problema resta infatti è un'osservazione non pertinente

71104
27-10-2007, 14:50
più chiaro di così si muore :read: il mio array infatti è largo abbastanza da accettare la sequenza di caratteri ed il terminatore nullo, ma mi spieghi come faccio a dire alla scanf la dimensione della sequenza di caratteri in questione? gliela devo passare con o senza il terminatore? 39 o 40?

k0nt3
27-10-2007, 14:57
il mio array infatti è largo abbastanza da accettare la sequenza di caratteri ed il terminatore nullo, ma mi spieghi come faccio a dire alla scanf la dimensione della sequenza di caratteri in questione? gliela devo passare con o senza il terminatore? 39 o 40?
leggendo il man dice:
"Matches a sequence of non-white-space characters"
quindi è senza terminatore :fagiano:

gepeppe
27-10-2007, 15:00
più chiaro di così si muore :read:

strano che non funziona fgets.. prova a compilare un programma tipo questo:

#include <stdio.h>

int main(char* argv[], int argc)
{
char stringa[10];
fgets(stringa, 10, stdin);
printf("%s\n", stringa);
return 0;
}

funziona?

mi stampa uello che gli passo in input..compresi gli spazi...tipo se gli scrivo solo ab, lui stampa ab + 8 spazi, ho fatto la prova mettendo in printf(%s X\n"); infatti e l'output è:
ab X

che palle stò winzoz!!! lo devo fare per forza qui...su linux non ho di questi problemi..uffa!!!!

71104
27-10-2007, 15:03
leggendo il man dice:
"Matches a sequence of non-white-space characters"
quindi è senza terminatore :fagiano:
a parte il fatto che quella riga è completamente sbagliata visto che, sia su Windows che su Linux, la conversione %s della scanf legge anche i caratteri whitespace... comunque ancora non capisco se il numero che indica la dimensione del buffer che io scrivo tra il % e la lettera 's' deve includere o meno il conteggio del terminatore NUL.

k0nt3
27-10-2007, 15:04
mi sa che lo spazio che stampa è quello dentro la printf :fagiano: prova a fare printf("%sX\n")

gepeppe
27-10-2007, 15:08
mi sa che lo spazio che stampa è quello dentro la printf :fagiano: prova a fare printf("%sX\n")

no ho sbagliato io...allora, io scrivo la prima volta, e non succede nulla premendo invio. cosi riscrivo, e lui mi stampa il percorso di prima, va a capo e poi mette la X cioè:

c:\pippi.txt
c:\pippo.txt
X

:(

k0nt3
27-10-2007, 15:10
a parte il fatto che quella riga è completamente sbagliata visto che, sia su Windows che su Linux, la conversione %s della scanf legge anche i caratteri whitespace... comunque ancora non capisco se il numero che indica la dimensione del buffer che io scrivo tra il % e la lettera 's' deve includere o meno il conteggio del terminatore NUL.
non mi risulta che la scanf legge i caratteri whitespace, ho anche provato ora per sicurezza.
la dimensione del buffer è relativa alla lunghezza di caratteri non-whitespace consecutivi, quindi senza terminatore, mentre la variabile che conterrà la stringa deve avere spazio anche per il terminatore.

~=N30=~
27-10-2007, 15:12
di' al tuo professore di ripassare: la scanf accetta nei format string un valore di "field width", che nel caso delle stringhe specifica la dimensione del buffer


e a quanto lo imposti?

k0nt3
27-10-2007, 15:12
no ho sbagliato io...allora, io scrivo la prima volta, e non succede nulla premendo invio. cosi riscrivo, e lui mi stampa il percorso di prima, va a capo e poi mette la X cioè:

c:\pippi.txt
c:\pippo.txt
X

:(
puoi postare tutto il codice?

71104
27-10-2007, 15:13
e a quanto lo imposti? bella domanda, vorrei tanto capirlo visto che il man non lo dice. per fortuna che me l'ha detto Microsoft.

gepeppe
27-10-2007, 15:14
puoi postare tutto il codice?

ehm..tutto il codice è un po troppo per entrare qui, e poi è su più file..posso postare solo il main...ma poi non potete usarlo...se volete lo carico tutto....ditemi voi...

71104
27-10-2007, 15:17
non mi risulta che la scanf legge i caratteri whitespace, ho anche provato ora per sicurezza. è vero, come non detto http://forums.nsn3.net/style_emoticons/default/53.gif

la dimensione del buffer è relativa alla lunghezza di caratteri non-whitespace consecutivi, quindi senza terminatore, mentre la variabile che conterrà la stringa deve avere spazio anche per il terminatore. questa è una tua interpretazione, oltrettutto (scusami) non ancora del tutto inequivocabile per me.

k0nt3
27-10-2007, 15:19
ehm..tutto il codice è un po troppo per entrare qui, e poi è su più file..posso postare solo il main...ma poi non potete usarlo...se volete lo carico tutto....ditemi voi...
no vabbè.. va bene solo il main o comunque la parte significativa

~=N30=~
27-10-2007, 15:20
da quel che ho capito il valore che imposti e' relativo al buffer della stringa no?
quindi siamo cmq punto e a capo, devi sapere quanto sara' grande la stringa max

k0nt3
27-10-2007, 15:23
è vero, come non detto http://forums.nsn3.net/style_emoticons/default/53.gif

questa è una tua interpretazione, oltrettutto (scusami) non ancora del tutto inequivocabile per me.
eheh capita, io sono uno di quelli che senza man non so scrivere nemmeno un hello world :asd:

se sei abituato a msdn non mi sorprende che non capisci bene le pagine man.. danno per scontate un pò di cose in più forse. comunque a me è sembrato subito chiaro perchè dice:
the array must be large enough to accept all the sequence and the terminating NUL character

quindi significa che l'array conterrà: la sequenza priva di caratteri whitespace + carattere terminatore
per una lunghezza totale di n+1 :fagiano:

gepeppe
27-10-2007, 15:27
ehm...non so come dirvelo...invece di scrivere scanf("%s", string) io avevo scritto scanf("%s\n", string); :doh:
marò mi dovete scusare, ma non me n'ero proprio accorto!! :doh: :doh:

non mi uccideteeeeee :cry: :cry:

k0nt3
27-10-2007, 15:28
ehm...non so come dirvelo...invece di scrivere scanf("%s", string) io avevo scritto scanf("%s\n", string); :doh:
marò mi dovete scusare, ma non me n'ero proprio accorto!! :doh: :doh:
eheh capita anche questo :D non importa, fa sempre bene dare una ripassatina a questi argomenti :O

k0nt3
27-10-2007, 15:35
da quel che ho capito il valore che imposti e' relativo al buffer della stringa no?
quindi siamo cmq punto e a capo, devi sapere quanto sara' grande la stringa max
vabbeh questo è inevitabile.. linguaggi come java permettono di non specificare la lunghezza solo perchè l'allocazione della memoria è fatta in automatico e comunque la dimensione dell'array è contenuta nell'oggetto (accessibile con getSize() mi pare).

k0nt3
27-10-2007, 15:42
ora che ci penso si può usare strlen però... ma ora devo scappare!
byex (saluto per i *nixiani)

~=N30=~
27-10-2007, 15:56
vabbeh questo è inevitabile.. linguaggi come java permettono di non specificare la lunghezza solo perchè l'allocazione della memoria è fatta in automatico e comunque la dimensione dell'array è contenuta nell'oggetto (accessibile con getSize() mi pare).

appunto quindi nn credo che il prof debba ripassare:D

71104
28-10-2007, 08:15
comunque a me è sembrato subito chiaro perchè dice:
the array must be large enough to accept all the sequence and the terminating NUL character

quindi significa che l'array conterrà: la sequenza priva di caratteri whitespace + carattere terminatore
per una lunghezza totale di n+1 :fagiano: d'accordissimo... e io nel format string che ci scrivo, n o n+1?

71104
28-10-2007, 08:26
da quel che ho capito il valore che imposti e' relativo al buffer della stringa no?
quindi siamo cmq punto e a capo, devi sapere quanto sara' grande la stringa max
1) non era quello il problema di cui si stava parlando
2) la soluzione esiste eccome: usi getch

k0nt3
28-10-2007, 10:53
1) non era quello il problema di cui si stava parlando
2) la soluzione esiste eccome: usi getch
ma getch non è in una libreria standard del C :fagiano: o si usa getchar o qualche trucco per emulare getch (in rete si trova subito)

d'accordissimo... e io nel format string che ci scrivo, n o n+1?
n è il numero di caratteri letti, quindi non vedo perchè mettere n+1. comunque le pagine man non sono tutta la documentazione, quando non si è sicuri dell'interpretazione bisogna consultare le pagine info.

*Warning:* To make a robust program, you must make sure that the
input (plus its terminating null) cannot possibly exceed the size
of the buffer you provide. In general, the only way to do this is
to specify a maximum field width one less than the buffer size.
*If you provide the buffer, always specify a maximum field width
to prevent overflow.*

c'è anche qualche esempio più sotto

comunque sia esiste un'estensione GNU alla scanf per prevenire i buffer overflow (e lo scopro solo ora?! :D )
precisamente:
A GNU extension to formatted input lets you safely read a string with no
maximum size. Using this feature, you don't supply a buffer; instead,
`scanf' allocates a buffer big enough to hold the data and gives you
its address. To use this feature, write `a' as a flag character, as in
`%as' or `%a[0-9a-z]'.
:fagiano:

~=N30=~
28-10-2007, 12:41
1) non era quello il problema di cui si stava parlando

2) sei a rischio di buffer overflow (l'input potrebbe superare i 40 caratteri); usa questo format string: "%40s"

rispondevo a questo


2)la soluzione esiste eccome: usi getch


quello della scanf e della lunghezza delle stringhe e' un problema senza soluzione (ho chiesto al prof di programmazione xke' ho avuto lo stesso problema)

puoi utilizzare una malloc e dei puntatori ma il problema resta

l'unica e' utilizzare una funzione diversa come quella che ti ho scritto prima

come puoi leggere ho scritto che quello della scanf non ha soluzione, non che non esistono altre funzioni per ovviare il problema

:)

gepeppe
28-10-2007, 12:51
azz..per una domanda stà succedento questo poco?? :asd: la prossima volta valuto meglio prima di postare :asd: :asd:

71104
28-10-2007, 14:09
ma getch non è in una libreria standard del C :fagiano: o si usa getchar o qualche trucco per emulare getch (in rete si trova subito) vabbè insomma :Prrr:

n è il numero di caratteri letti, quindi non vedo perchè mettere n+1. perché nessuno mi ha detto di mettere n, ovvero nessuno mi ha detto se mettere un conteggio inclusivo o esclusivo del carattere di terminazione

comunque le pagine man non sono tutta la documentazione, quando non si è sicuri dell'interpretazione bisogna consultare le pagine info. avrei qualcosa da ridire sull'accessibilità della documentazione di Linux :mbe:

71104
28-10-2007, 14:10
rispondevo a questo no, a quello avevo già risposto io: bastava usare il format string che ho indicato.

come puoi leggere ho scritto che quello della scanf non ha soluzione, non che non esistono altre funzioni per ovviare il problema di' al tuo prof di ripassare lo stesso: k0nt3 ha appena citato un'estensione GNU che costituisce una perfetta soluzione al problema di cui comunque non si stava parlando.

~=N30=~
28-10-2007, 14:15
no, a quello avevo già risposto io: bastava usare il format string che ho indicato.

di' al tuo prof di ripassare lo stesso: k0nt3 ha appena citato un'estensione GNU che costituisce una perfetta soluzione al problema di cui comunque non si stava parlando.



fatto sta ke io dicevo ke per scanf il problema e' irrisolvibile e la tua soluzione di format string prevede cmq di sapere quanto sara' lunga la stringa al max e quindi di fatto non risolve il problema di partenza

e dato che parlavamo o perlomeno ho citato soltanto la funzione SCANF, e ho detto che PER quella NON c'e' soluzione direi ke e' inutile trovare anche millemilafunzioni che risolvono il problema

detto questo
direi ke si puo' anke chiudere ke tanto il problema e' risolto

k0nt3
28-10-2007, 16:34
avrei qualcosa da ridire sull'accessibilità della documentazione di Linux :mbe:
questa non te la passo :O un conto è dire che non sei pratico della documentazione di linux, ma un'altro è dire che è carente. anche perchè linux è forse l'oggetto più documentato dell'informatica :read:
ma poi le stesse pagine man rimandano alla documentazione info per una descrizione più precisa, quindi non c'è niente da dire :banned: :D

cionci
28-10-2007, 16:59
Cerchiamo di rimanere in topic...il thread non tratta di Linux Vs Windows.

okay
28-10-2007, 18:08
salve a tutti, devo usare scanf per inserire da tastiera il percorso di un file, solo che dopo la prima chiamata tutto ok, ma alla seconda, anche se cambio la variabile dove memorizzare il valore di scanf devo inserirla due volte. cioè la prima volta faccio:

char primo[40];
char secondo[40];

scanf("%s", &primo);

altro codice....

scanf("%s", &secondo);


ma la seconda volta dopo che inserisco i lpercorso, si ferma e lo devo inserire di nuovo. perchè?? inoltre c'è una funzione sostitutiva di scanf per le stringh? perchè per i valori numerici singoli ho usato getch()

grazie

se non sei obbligato ad usare la scanf, che peraltro ti tronca allo spazio, puoi usare gets:


char buf[20];
gets(buf);

71104
28-10-2007, 18:12
fatto sta ke io dicevo ke per scanf il problema e' irrisolvibile non lo è

e la tua soluzione di format string prevede cmq di sapere quanto sara' lunga la stringa al max e quindi di fatto non risolve il problema di partenza non è il problema di cui si stava parlando

e dato che parlavamo o perlomeno ho citato soltanto la funzione SCANF, e ho detto che PER quella NON c'e' soluzione c'è

direi ke e' inutile trovare anche millemilafunzioni che risolvono il problema lascia perdere la getch o la fgets, fai come se non ne avessi mai parlato

detto questo direi ke si puo' anke chiudere ke tanto il problema e' risolto bravissimo, vedo che inizi a capire :asd:

71104
28-10-2007, 18:13
se non sei obbligato ad usare la scanf, che peraltro ti tronca allo spazio, puoi usare gets:


char buf[20];
gets(buf);

buffer overflow

k0nt3
28-10-2007, 18:15
se non sei obbligato ad usare la scanf, che peraltro ti tronca allo spazio, puoi usare gets:


char buf[20];
gets(&buf);

inizio a pensare che la scanf sia la funzione più sottovaluta della storia :p
in realtà usando scanf("%10c", &buf) gli spazi vengono mantenuti :read: inoltre in questo modo sei obbligato a dare un limite alla dimensione dell'input

71104
28-10-2007, 18:18
questa non te la passo :O lo so: un linuxista non accetta mai ciò che ha da dire un windowsista. ovviamente linuxista si può anche estendere a generico utente di sistema Unix-based.

un conto è dire che non sei pratico della documentazione di linux, e un conto è dire che è difficile diventarci pratici, ebbene si

ma un'altro è dire che è carente. infatti non l'ho detto (ne' scritto, onde evitare battute banali :D)

ma poi le stesse pagine man rimandano alla documentazione info per una descrizione più precisa, quindi non c'è niente da dire :banned: :D ho fatto un brutale search della parola "info" nella pagina di man della scanf: appare una volta sola in un punto dove non andrei mai a cercare nell'intento di capire il valore del field width che devo passare nel format string :Prrr:

ribadisco la scarsa accessibilità della documentazione di Linux; mi sembra impossibile paragonarla al sito della libreria di MSDN.

okay
28-10-2007, 19:42
buffer overflow

x gepeppe

char primo[40];
char secondo[40];

gets(primo);
gets(secondo);

... per quello che chiedi è perfetto... vedrai che non hai quel problema.

il buffer overflow... lascialo agli scienziati di questo forum

71104
28-10-2007, 19:45
x gepeppe

char primo[40];
char secondo[40];

gets(primo);
gets(secondo);

... per quello che chiedi è perfetto... vedrai che non hai quel problema.

il buffer overfloow... lascialo agli scienziati di questo forum non so se hai capito che da scanf("%s", ...) a gets a lui non cambia assolutamente nulla...

okay
28-10-2007, 19:47
non so se hai capito che da scanf("%s", ...) a gets a lui non cambia assolutamente nulla...

ho provato il code e con gets() ho risolto...nessun problema
quale è il problema...?


Edit1: Uso vs 2005 io... tutto okay

Edit2: ho riletto il post e lui ha provato fgets(); che non è gets();

gets(); l'ho scritto solo io, scienziato.

cionci
29-10-2007, 00:03
gets soffre dello stesso problema di scanf. In pratica non potendo limitare il numero di caratteri in input potrebbe causare un buffer overflow nello spazio allocato per la stringa.

okay
29-10-2007, 07:50
gets soffre dello stesso problema di scanf. In pratica non potendo limitare il numero di caratteri in input potrebbe causare un buffer overflow nello spazio allocato per la stringa.

ma ti pare che non conosco il buffer ofw?... lo conosco da quando iniziai.

Il fatto è che chiedeva che gli si bloccava il programma infatti l'ho provato e le 2 scanf lo bloccano proprio.

Con gets() risolve perlomeno va avanti lo sappiamo tutti del problema del buffer ofw... neanche alla m$ l'hanno risolto.

Io usavo la scanf solo per leggere, nei miei vecchi listati, file testo.

Un'altro modo allora è usare cin>>buf e cin.ignore(x)

c'è sempre buffer ofw ma cmq và avanti nel prg

k0nt3
29-10-2007, 14:40
cin non esiste visto che stiamo parlando di C.. comunque se rileggi il topic vedi che il problema non era la scanf in se, ma il fatto che aveva messo un \n di troppo.
detto questo l'unica soluzione al problema del buffer overflow senza dare un limite massimo al momento rimane quell'estensione GNU alla scanf (%a)

71104
29-10-2007, 17:18
ma ti pare che non conosco il buffer ofw?... lo conosco da quando iniziai. non sembra

Il fatto è che chiedeva che gli si bloccava il programma infatti l'ho provato e le 2 scanf lo bloccano proprio. il programma gli si bloccava perché usava un format string errato (post #32)

Con gets() risolve perlomeno va avanti lo sappiamo tutti del problema del buffer ofw... da scanf("%s", ...) a gets non cambia nulla

neanche alla m$ l'hanno risolto. :rotfl:

Io usavo la scanf solo per leggere, nei miei vecchi listati, file testo. scanf di norma non legge files

Un'altro modo allora è usare cin>>buf e cin.ignore(x)

c'è sempre buffer ofw se buf è un oggetto string non c'è nessun pericolo di buffer overflow

ma cmq và avanti nel prg anche con una scanf usata correttamente "va avanti nel programma"

okay
29-10-2007, 17:42
non sembra

il programma gli si bloccava perché usava un format string errato (post #32)

da scanf("%s", ...) a gets non cambia nulla

:rotfl:

scanf di norma non legge files

se buf è un oggetto string non c'è nessun pericolo di buffer overflow

anche con una scanf usata correttamente "va avanti nel programma"

va bene...

allora tutto a posto...

ciao