Sscan
, Sscanf
Parsing in values from space-separated strings is a problem that has existed for many years. Even the earliest programmers may have struggled with this problem.
With Sscan
and Sscanf
, we can parse strings into multiple values. Sscan
uses a space as a separator. And Sscanf
uses a format string
to guide its parsing.
Sscan
exampleHere we have a string
that has values in it separated by spaces. We pass the correct number of arguments (as references) to fmt.Sscan
. They are filled with the parsed values.
package main
import "fmt"
func main() {
// Store values from Sscan in these locals.
value1 := ""
value2 := ""
value3 := 0
// Scan the 3 strings into 3 local variables.
// ... Must pass in the address of the locals.
_, err := fmt.Sscan("Bird frog 100", &value1, &value2, &value3);
// If the error is nil, we have successfully parsed the values.
if err == nil {
// Print the values.
fmt.Println("VALUE1:", value1);
fmt.Println("VALUE2:", value2);
fmt.Println("VALUE3:", value3);
}
}VALUE1: Bird
VALUE2: frog
VALUE3: 100
Sscanf
With this method, we must specify a format string
to guide the parsing of the values. We can use standard format codes in the format string
.
Sscanf
works the same way as Sscan
except we must pass a format string
as the second argument.package main
import "fmt"
func main() {
value1 := 0
value2 := ""
value3 := 0
// Use format string to parse in values.
// ... We parse 1 number, 1 string and 1 number.
_, err := fmt.Sscanf("10 Bird 5", "%d %s %d", &value1, &value2, &value3);
if err == nil {
fmt.Println("VALUE1:", value1);
fmt.Println("VALUE2:", value2);
fmt.Println("VALUE3:", value3);
}
}VALUE1: 10
VALUE2: Bird
VALUE3: 5
Sscan
versus splitWith split()
or fields()
we can separate values and parse them. This has some advantages over Sscan
, particularly for oddly-formed strings.
With fmt.Sscan
and Sscanf
we have built-in parsing methods for strings that contain multiple values. These methods, when used correctly, can simplify programs.