1
0
mirror of https://github.com/golang/go synced 2024-11-25 20:57:57 -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:
Rob Pike 2010-08-07 10:02:04 +10:00
parent df88fc6109
commit 18063d4686
2 changed files with 50 additions and 4 deletions

View File

@ -598,18 +598,24 @@ func (s *ss) scanComplex(verb int, n int) complex128 {
// convertString returns the string represented by the next input characters. // convertString returns the string represented by the next input characters.
// The format of the input is determined by the verb. // 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") { if !s.okVerb(verb, "svqx", "string") {
return "" return ""
} }
s.skipSpace(false) s.skipSpace(false)
switch verb { switch verb {
case 'q': case 'q':
return s.quotedString() str = s.quotedString()
case 'x': 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. // quotedString returns the double- or back-quoted string represented by the next input characters.

View File

@ -464,6 +464,46 @@ func TestScanMultiple(t *testing.T) {
if a != 123 || s != "abc" { if a != 123 || s != "abc" {
t.Errorf("Sscan wrong values: got (%d %q) expected (123 \"abc\")", a, s) 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) { func TestScanNotPointer(t *testing.T) {