La risposta breve è sì, nel vostro caso si può garantire che int1
e int2
non sono cambiati.
Tuttavia, vorrei consigliare contro affidamento su questo comportamento, in quanto è in grado di produrre codice che è difficile da leggere - e perché:
La risposta lunga è dipende dalla vostra stringa di formato. Osservando lo standard C11 per fscanf
(s7.21.6.2.16), si ha:
La funzione fscanf restituisce il valore del EOF macro se si verifica un errore ingresso prima della prima conversione (se presente) ha completato . In caso contrario, la funzione restituisce il numero di elementi di input assegnati, che può essere inferiore a quello previsto o addirittura pari a zero, in l'evento di un errore di abbinamento anticipato.
criticamente importante è questa definizione di elementi di input da più avanti in 7.21.6.2:
Un elemento ingresso è definito come la più lunga sequenza di caratteri di input che non supera qualsiasi larghezza campo specificato e che è, o è un prefisso di, una sequenza di input corrispondente
così. Il numero restituito da scanf è il numero di elementi letti dallo stream, non il numero di puntatori scritti in.
Inoltre rilevante è 7.21.6.2.2:
Se il formato si esaurisce mentre rimangono argomenti, l'eccesso argomenti vengono valutati (come sempre), ma sono altrimenti ignorati.
Il comportamento di ignorare argomenti che non sono scritti È inoltre chiarito in un esempio alla fine di questa sezione:
In:
#include <stdio.h>
/* ... */
int d1, d2, n1, n2, i;
i = sscanf("123", "%d%n%n%d", &d1, &n1, &n2, &d2);
valore 123
è assegnato a d1
e il valore 3
a n1
. Poiché %n
non può mai ottenere un errore di input, il valore di 3
viene anche assegnato a n2
. Il valore di d2
non è interessato. Il valore 1
è assegnato a i
.
Nel caso in cui non hai familiarità con %n
, è "il numero di caratteri letti dal flusso finora".
Questo è un ottimo esempio per illustrare la tua domanda - qui abbiamo scritto tre puntatori e un puntatore intatto. Ma, fscanf
restituisce solo 1 qui - perché ha assegnato solo un "elemento di input" dal flusso.
Quindi, nel tuo esempio, sì, se hai %d %d
e lo passi qualcosa che causa 0 letture, allora sì, i puntatori non saranno toccati.
Tuttavia, se si dispone di un valore %n
, la funzione potrebbe comunque restituire 0 o EOF mentre continua a utilizzare input e scrivere ai puntatori. Per esempio:
sscanf("aaa","aaa%n%d",&n1,&n2);
Questo scrive 3
a n1
, lascia n2
intatta, e restituisce EOF
. E:
sscanf("aaa bbb","aaa%n%d",&n1,&n2);
Questo scrive 3
a n1
, lascia n2
intatta, e restituisce 0.
(Duplicato trovato da Blue Moon, sotto) –