fmt.Sscanf în Go

Citește valori dintr-un text (string) în variabile, ca Scan, Scanf și Scanln, dar fără tastatură.

Sintaxă
func Sscanf(str string, format string, a ...any) (n int, err error)
func Sscan(str string, a ...any) (n int, err error)
func Sscanln(str string, a ...any) (n int, err error)

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, &nota, &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 și err.
  • Folosești %s pentru un text care conține spații: %s citeș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.