Skip to content
Snippets Groups Projects
Commit e1715dd6 authored by Anna Morpurgo's avatar Anna Morpurgo
Browse files

note sull'uso di Scanf e Sscanf

parent 36086a79
Branches
No related tags found
No related merge requests found
### Estrazione di dati da una stringa con un formato dato
Quando le righe o le stringhe in input hanno un **formato fissato**,
- se c'è **un solo tipo di separatore**, si usa la funzione
`strings.Split(s, sep string)` che restituisce la slice delle sottostringhe
- Esempio: data nel formato `gg/mm/aaaa`
```go
sep := "/"
slice := strings.Split(s, sep)
```
Il giorno, il mese e l'anno vengono salvati come elementi nella slice
- se ci sono **diversi tipi di separatori**, il package `fmt` mette a disposizione
la funzione `Scanf`, che usa una sintassi analoga a `Printf` per leggere e memorizzare valori (invece di stamparli):
```go
fmt.Scanf(format string, lista di puntatori a var)
```
```go
var anno, mese, giorno, ore, min, sec int
//stampo data e orario nel formato AAAA-MM-GG/hh:mm:ss
fmt.Prinf("%d-%d-%d/%d:%d:%d", anno, mese, giorno, ore, min, sec)
//leggo data e orario (da tastiera), con i valori
//di anno, mese, giorno, ore, min, sec in una stringa in formato AAAA-MM-GG/hh:mm:ss
fmt.Scanf("%d-%d-%d/%d:%d:%d", &anno, &mese, &giorno, &ore, &min, &sec)
```
E anche Sscanf per estrarre dati da una stringa
- Esempio:
```go
stringData := "15/12/2022"
fmt.Sscanf(stringData, "%d/%d/%d", &gg, &mm, &aa)
```
**Nota**.
`%s` prende tutti i caratteri fino al primo carattere di spaziatuta, o fino alla fine dell'input se non ci sono spaziature. In alternativa si può specificare il numero (massimo) di caratteri da leggere (se non si incontra prima un carattere di spaziatura):
`%5s` legge una stringa di (max) 5 caratteri (caratteri di spaziatura esclusi).\
Ad esempio,
```go
fmt.Sscanf(" 1234567 ", "%5s%d", &s, &i)
```
memorizzerà "12345" in s e 67 in i.
```go
Sscanf(" 12 34 567 ", "%5s%d", &s, &i)
```
memorizzerà "12" in s e 34 in i.
```go
var ore, min, sec int
var pre string
//leggo orario (da tastiera), con i valori
//di ore, min e sec in una stringa in formato "UTC h:m:s"
ora := "UTC-11:36:21"
fmt.Sscanf(ora, "%4s%d:%d:%d", &pre, &ore, &min, &sec)
```
memorizzerà "UTC-" in pre, 11 in ore, 36 in min e 21 in sec.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment