Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 27-10-2007, 11:58   #1
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
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);
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
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread
gepeppe è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2007, 13:44   #2
Alhazred
Senior Member
 
L'Avatar di Alhazred
 
Iscritto dal: Dec 2003
Messaggi: 1776
Probabilmente da fastidio la pressione di invio, prova a mettere un getchar(); dopo le scanf.
Alhazred è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2007, 13:45   #3
~=N30=~
Member
 
Iscritto dal: Jun 2003
Messaggi: 198
Quote:
Originariamente inviato da gepeppe Guarda i messaggi
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);
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()
__________________
finalmente adsl normale!
ho concluso felicemente con:
17mika, Moloch666, lucariello86, passionsmart,
~=N30=~ è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2007, 14:05   #4
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
Quote:
Originariamente inviato da Alhazred Guarda i messaggi
Probabilmente da fastidio la pressione di invio, prova a mettere un getchar(); dopo le scanf.
provato, non cambia nulla

Quote:
Originariamente inviato da ~=N30=~ Guarda i messaggi
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?
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread
gepeppe è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2007, 14:11   #5
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da gepeppe Guarda i messaggi
Codice:
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 è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2007, 14:14   #6
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da 71104 Guarda i messaggi
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"
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2007, 14:19   #7
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
Quote:
Originariamente inviato da 71104 Guarda i messaggi
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!!
__________________
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 14:24.
gepeppe è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2007, 14:19   #8
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da 71104 Guarda i messaggi
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
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2007, 14:25   #9
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
Quote:
Originariamente inviato da 71104 Guarda i messaggi
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
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread
gepeppe è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2007, 14:31   #10
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da gepeppe Guarda i messaggi
ah! anima candida, non sai nulla del dibattito Linux vs. Windows che scalda gli animi di mezzo mondo
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2007, 14:32   #11
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7263
Quote:
Originariamente inviato da 71104 Guarda i messaggi
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
fortuna che non è vero http://www.rt.com/man/scanf.3.html
Quote:
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.
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2007, 14:37   #12
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
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
gepeppe è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2007, 14:40   #13
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da k0nt3 Guarda i messaggi
fortuna che non è vero http://www.rt.com/man/scanf.3.html
è 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:
Codice:
char s[10];

scanf("%9s", s, 10);
http://msdn2.microsoft.com/en-us/lib...et(VS.80).aspx



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 14:44.
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2007, 14:42   #14
~=N30=~
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,
~=N30=~ è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2007, 14:45   #15
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7263
Quote:
the array must be large enough to accept all the sequence and the terminating NUL character
più chiaro di così si muore

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;
}
funziona?
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2007, 14:49   #16
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da ~=N30=~ Guarda i messaggi
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

Quote:
puoi utilizzare una malloc e dei puntatori ma il problema resta
infatti è un'osservazione non pertinente
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2007, 14:50   #17
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da k0nt3 Guarda i messaggi
più chiaro di così si muore
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?
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2007, 14:57   #18
k0nt3
Senior Member
 
Iscritto dal: Dec 2005
Messaggi: 7263
Quote:
Originariamente inviato da 71104 Guarda i messaggi
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
k0nt3 è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2007, 15:00   #19
gepeppe
Senior Member
 
L'Avatar di gepeppe
 
Iscritto dal: Jun 2005
Città: Napoli
Messaggi: 2599
Quote:
Originariamente inviato da k0nt3 Guarda i messaggi
più chiaro di così si muore

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;
}
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!!!!
__________________
Hp pavilion dv6-1250el [cpu: P8700 - ati radeon hd 4650 1 gb - 4 gb ram - hd 320 7200 rpm!] Garmin Official Thread
gepeppe è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2007, 15:03   #20
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
Quote:
Originariamente inviato da k0nt3 Guarda i messaggi
leggendo il man dice:
"Matches a sequence of non-white-space characters"
quindi è senza terminatore
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.
71104 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
La Serie A con DAZN e Amazon Prime con l...
Giochi Ubisoft su Steam senza Ubisoft Co...
Miami Beach ha autorizzato la maxi opera...
Apple regala un altro anno di funzioni s...
Alla fine è successo davvero: Vol...
Il meglio di Amazon del weekend in uno s...
Speciale TV in offerta su Amazon: Hisens...
Non c'è pace per Trezor: 347.000 e-mail ...
È un portatile Dell e li vale tut...
Apple iPhone 17 Pro Max 256GB a 1.195€ (...
GPT-6 Astra è davvero AGI o non s...
LG OLED G6S 48'' a 845€ e G6 55'' a 1368...
Mantax Otax: il malware Android che crip...
Musk incassa un altro maxi contratto IA:...
Le vendite di EV sono esplose in tutto i...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 15:17.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v