mirror of
https://github.com/golang/go
synced 2024-11-21 22:44:40 -07:00
fmt.Scan: empty strings are errors
Fixes #1002. R=rsc CC=golang-dev https://golang.org/cl/1882046
This commit is contained in:
parent
df88fc6109
commit
18063d4686
@ -598,18 +598,24 @@ func (s *ss) scanComplex(verb int, n int) complex128 {
|
||||
|
||||
// convertString returns the string represented by the next input characters.
|
||||
// The format of the input is determined by the verb.
|
||||
func (s *ss) convertString(verb int) string {
|
||||
func (s *ss) convertString(verb int) (str string) {
|
||||
if !s.okVerb(verb, "svqx", "string") {
|
||||
return ""
|
||||
}
|
||||
s.skipSpace(false)
|
||||
switch verb {
|
||||
case 'q':
|
||||
return s.quotedString()
|
||||
str = s.quotedString()
|
||||
case 'x':
|
||||
return s.hexString()
|
||||
str = s.hexString()
|
||||
default:
|
||||
str = s.token() // %s and %v just return the next word
|
||||
}
|
||||
return s.token() // %s and %v just return the next word
|
||||
// Empty strings other than with %q are not OK.
|
||||
if len(str) == 0 && verb != 'q' && s.maxWid > 0 {
|
||||
s.errorString("Scan: no data for string")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// quotedString returns the double- or back-quoted string represented by the next input characters.
|
||||
|
@ -464,6 +464,46 @@ func TestScanMultiple(t *testing.T) {
|
||||
if a != 123 || s != "abc" {
|
||||
t.Errorf("Sscan wrong values: got (%d %q) expected (123 \"abc\")", a, s)
|
||||
}
|
||||
n, err = Sscan("asdf", &s, &a)
|
||||
if n != 1 {
|
||||
t.Errorf("Sscan count error: expected 1: got %d", n)
|
||||
}
|
||||
if err == nil {
|
||||
t.Errorf("Sscan expected error; got none", err)
|
||||
}
|
||||
if s != "asdf" {
|
||||
t.Errorf("Sscan wrong values: got %q expected \"asdf\"", s)
|
||||
}
|
||||
}
|
||||
|
||||
// Empty strings are not valid input when scanning a string.
|
||||
func TestScanEmpty(t *testing.T) {
|
||||
var s1, s2 string
|
||||
n, err := Sscan("abc", &s1, &s2)
|
||||
if n != 1 {
|
||||
t.Errorf("Sscan count error: expected 1: got %d", n)
|
||||
}
|
||||
if err == nil {
|
||||
t.Errorf("Sscan <one item> expected error; got none")
|
||||
}
|
||||
if s1 != "abc" {
|
||||
t.Errorf("Sscan wrong values: got %q expected \"abc\"", s1)
|
||||
}
|
||||
n, err = Sscan("", &s1, &s2)
|
||||
if n != 0 {
|
||||
t.Errorf("Sscan count error: expected 0: got %d", n)
|
||||
}
|
||||
if err == nil {
|
||||
t.Errorf("Sscan <empty> expected error; got none")
|
||||
}
|
||||
// Quoted empty string is OK.
|
||||
n, err = Sscanf(`""`, "%q", &s1)
|
||||
if n != 1 {
|
||||
t.Errorf("Sscanf count error: expected 1: got %d", n)
|
||||
}
|
||||
if err != nil {
|
||||
t.Errorf("Sscanf <empty> expected no error with quoted string; got %s", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestScanNotPointer(t *testing.T) {
|
||||
|
Loading…
Reference in New Issue
Block a user