|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
[C] scanf chiede due volte il valore - sostituta
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:
Codice:
char primo[40];
char secondo[40];
scanf("%s", &primo);
altro codice....
scanf("%s", &secondo);
grazie
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Dec 2003
Messaggi: 1767
|
Probabilmente da fastidio la pressione di invio, prova a mettere un getchar(); dopo le scanf.
|
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Jun 2003
Messaggi: 198
|
Quote:
(ps: puoi nn mettere la & se stai trattando array) altre funzioni al posto di scanf ci sono, prova ad utilizzare la fgets()
__________________
finalmente adsl normale! ho concluso felicemente con: 17mika, Moloch666, lucariello86, passionsmart, |
|
|
|
|
|
|
#4 | ||
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
Quote:
Quote:
inoltre fgets() non ha bisogno di sapere qunti caratteri deve leggere? e se io non lo sapessi a priori?
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
||
|
|
|
|
|
#5 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
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. |
|
|
|
|
|
|
#6 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
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"
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
Quote:
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!!
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread Ultima modifica di gepeppe : 27-10-2007 alle 15:24. |
|
|
|
|
|
|
#8 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
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
|
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
Quote:
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
|
#10 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
|
|
|
|
|
|
#11 | ||
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
Quote:
Quote:
|
||
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
si ma alla fine io cosa faccio cò stà scanf?
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
#13 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
molto più chiara MSDN invece, che fa un esempio di codice assolutamente inequivocabile: Codice:
char s[10];
scanf("%9s", s, 10);
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. Ultima modifica di 71104 : 27-10-2007 alle 15:44. |
|
|
|
|
|
|
#14 |
|
Member
Iscritto dal: Jun 2003
Messaggi: 198
|
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
__________________
finalmente adsl normale! ho concluso felicemente con: 17mika, Moloch666, lucariello86, passionsmart, |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
Quote:
strano che non funziona fgets.. prova a compilare un programma tipo questo: Codice:
#include <stdio.h>
int main(char* argv[], int argc)
{
char stringa[10];
fgets(stringa, 10, stdin);
printf("%s\n", stringa);
return 0;
}
|
|
|
|
|
|
|
#16 | ||
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
Quote:
|
||
|
|
|
|
|
#17 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
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?
|
|
|
|
|
|
#18 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
Quote:
"Matches a sequence of non-white-space characters" quindi è senza terminatore
|
|
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
|
Quote:
ab X che palle stò winzoz!!! lo devo fare per forza qui...su linux non ho di questi problemi..uffa!!!!
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread |
|
|
|
|
|
|
#20 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
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.
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:55.



















