Ce face fmt.Sscanf
Funcțiile Sscan, Sscanf și Sscanln (primul S vine de la string) extrag valori dintr-un text pe care îl ai deja: un rând citit dintr-un fișier, un parametru, o coordonată. Regulile sunt aceleași ca la fmt.Scan: dai pointeri, iar textul este convertit la tipul fiecărei variabile.
Sscanf este cea mai folosită: cu un format ca "%d-%d-%d" poți desface o dată sau un cod. Sscan separă după spații și rânduri noi; Sscanln se oprește la primul rând nou.
Pentru un singur număr, strconv.Atoi sau strconv.ParseFloat sunt mai stricte și mai rapide; pentru texte despărțite prin virgule, strings.Split este mai potrivit.
Parametri
| Parametru | Descriere |
|---|---|
str |
Textul din care se citește. |
format |
Doar la Sscanf: șablonul cu verbe. |
a ...any |
Pointerii la variabilele care primesc valorile. |
Ce returnează
Numărul de valori citite și eroarea (de exemplu unexpected EOF dacă textul se termină prea devreme).
Exemple
Exemplul 1: Desfacerea unei date și a unei coordonate
package main
import "fmt"
func main() {
var an, luna, zi int
n, err := fmt.Sscanf("2026-10-19", "%d-%d-%d", &an, &luna, &zi)
fmt.Println(n, err, "->", zi, luna, an)
var lat, lon float64
fmt.Sscanf("Iași (47.16, 27.58)", "Iași (%f, %f)", &lat, &lon)
fmt.Printf("latitudine %.2f, longitudine %.2f\n", lat, lon)
}
Rezultat
3 <nil> -> 19 10 2026
latitudine 47.16, longitudine 27.58
Exemplul 2: Sscan pe cuvinte și o eroare de conversie
Al doilea text are „nouă” în loc de un număr: Sscan citește doar numele și returnează eroare.
package main
import "fmt"
func main() {
for _, rand := range []string{"Ana 10 9.5", "Ion nouă 8"} {
var nume string
var nota int
var medie float64
n, err := fmt.Sscan(rand, &nume, ¬a, &medie)
fmt.Printf("%q: citite %d, eroare: %v\n", rand, n, err)
}
var a, b int
n, err := fmt.Sscanln("3\n4", &a, &b)
fmt.Println("Sscanln:", n, err)
}
Rezultat
"Ana 10 9.5": citite 3, eroare: <nil>
"Ion nouă 8": citite 1, eroare: expected integer
Sscanln: 1 unexpected newline
Greșeli frecvente
- Formatul nu se potrivește exact cu textul (alt separator, un spațiu în plus). Sscanf se oprește la prima nepotrivire și returnează câte valori a citit până acolo; verifică
nșierr. - Folosești
%spentru un text care conține spații:%scitește doar până la primul spațiu.
Comenzi înrudite
fmt.Scan: Citește valori de la tastatură (intrarea standard) în variabile; Scanln se oprește la capăt de rând, Scanf folosește un format.fmt.Fscan: Citește valori dintr-un io.Reader (fișier, buffer, os.Stdin) în variabile, ca Scan, Scanf și Scanln.strconv.Atoi: Atoi transformă un text în număr întreg (int) și returnează eroare dacă nu se poate; Itoa face invers.strings.Split: Împarte textul în bucăți după un separator exact; SplitN limitează numărul de bucăți, SplitAfter păstrează separatorul.