Ce tip de scanează Modificatorul sscanf% Fd?

Am dat peste un cod vechi care are următorul tip de linie:

sscanf (szBuff, "% Fd% Ff% Fd% Ff"

Sa întâmplat cineva cu un modificator ca Fd sau Ff? Dacă da, ce înseamnă?

Nu pot să găsesc informații despre asta. Codul se compilează și rulează bine.

1
De ce ați tăiat exemplul în locul în care devine interesant, adică celelalte sscanf args și declarațiile lor?
adăugat autor Jens, sursa
Ce compilator și/sau mediu dev?
adăugat autor Throwback1986, sursa

3 răspunsuri

C spune pentru funcțiile fscanf :

(C99 1 , 7.19.6.2p14) Specificatorii de conversie A, E, F, G și X sunt de asemenea valabili și se comportă aceleași cu a, e, f, g și x.

Deci, în % Fd , specificația conversiei este % F care este echivalentă cu % f . Rețineți că d nu face parte din specificația de conversie.

De exemplu, pentru fprintf funcțiile % F sunt, de asemenea, aceleași ca și % f

printf("%fd\n", 3.141592);

va imprima:

3.141592d

1. C89/C90 nu recunoaște specificatorul de conversie F . De exemplu, pentru fscanf , paragraful C90 corespunzător din 7.9.6.2 spune: Specificatorii de conversie E, G și X sunt de asemenea valabili și se comportă la fel ca, respectiv, e, g și x
6
adăugat
Se pare că Jack folosește un sistem non-standard, unde "% Fs" are de fapt nevoie de un pointer-char pentru a merge cu el, iar "F" este un modificator.
adăugat autor Jens, sursa

%F is a POSIX (and C99) extension.

http://pubs.opengroup.org/onlinepubs/007904975/functions/scanf.html

"Specificațiile de conversie A, E, F, G și X sunt, de asemenea, valide și trebuie să fie echivalente cu a, e, f, g, respectiv x."

1
adăugat

Așa cum a subliniat, acestea sunt aceleași cu omologii lor mici. De ce este asta? Pentru simetrie cu specificatorii de conversie printf. Aici % x și % X scrieți litere mici sau mari ca deadbeef și DEADBEEF . Simetria permite folosirea aceluiași șir de format pentru ambele intrări cu scanf și ieșire cu printf .

#define FMT "%F\n"

sscanf (str, FMT, &value);
printf (FMT, value);
1
adăugat
Acestea sunt toate indicii pentru float (pentru% F ...) și int (pentru% d), nu?
adăugat autor Jens, sursa
Iată o singură linie de exemplu de cod: sscanf (szTemp, "% Ff% Ff% Ff% Ff% d% d% Fd% Fd% Ff% d% Fs% d & sp_fpt0.x & sp_fpt0.y & sp_fpt1 .x, & sp_fpt1.y, & iMember1, & iMember2, & sp_iMember1End, & sp_iMember2End, & sp_fDist, & iSpliceMember, & iPlumbMember, sp_szOrigLabel, & sp_iPlumbIntLoc);
adăugat autor Jack, sursa
Este corect. % Fs este pentru un șir de caractere (char sp_szOrigLabel [20])
adăugat autor Jack, sursa