C / C ++からGolangに切り替える多くの友人は、Goの入力制御について頭痛を感じることが多いと思います。。。特に、Goで次のコードをC言語でシミュレートする場合は、多くの混乱が発生します。
char input[100];
while (1) {
if (scanf("%s", input) == EOF) {
printf("输入结束\n");
break;
}
}
上記のコードは、コンソールでCtrl + Z(EOF)を入力することにより、入力を終了できます。
C言語のintscanf()関数はint型を返し、その値は3つの場合のみです。
(1)すべてが正常である場合、入力された文字数、つまり値> 0を返します。
(2)エラーが発生した場合は、0を返します。
(3)終了文字EOFが検出された場合は、-1を返します。
3番目に注意してください。ターミネータに遭遇すると-1を返し、入力を終了します。つまり、EOF(EOFは実際には-1)を入力すると、入力は終了します。
次に、Goで試して、fmt.Scanf()(int、error)関数を使用してみましょう。
var input string
for {
ret, err := Scanf("%s\r\n", &input) //fmt.Scanf()有两个返回值
}
これらの2つの戻り値に注意する必要があります。最初の戻り値はfmt.Scanf()によって正常に入力された文字数を表し、2番目は返されたエラーです。
もちろん、返されたエラー値を使用してCを達成できるかどうかを試し、コンソールにCtrl + Zを入力して入力を終了することを考えます。
import (
. "fmt"
"io"
)
func main() {
var input string
for {
_, err := Scanf("%s\r\n", &input)
if err == io.EOF {
break
}
}
}
しかし、実験結果は、入力Ctrl + Zが入力を終了できない場合でも、これは役に立たないことを示しています。
ちなみに、fmt.Scanf()もint型の戻り値を返します。C言語のscanf()の戻り値と比較して、この改良版のC言語も-1を使用して、祖先のようにEOFを示します。何?それを試してみてください:
import (
. "fmt"
"text/scanner"
)
func main() {
var input string
for {
ret, _ := Scanf("%s\r\n", &input)
if ret == scanner.EOF {
//或者用ret == -1
break
}
}
}
実験した結果、この方法では、Ctrl + Zを使用してコンソールでの入力を終了できないことがわかりました。
これは奇妙です。コンソールのCtrl + Zを取得した後、GoプログラムはそれをEOFと見なしませんか???そこで、コンソールでCtrl + Zを入力して入力内容をテストすることにしました。テストコードは、次のとおりです。
import (
. "fmt"
)
func main() {
var input string
for {
_, _ = Scanf("%s\r\n", &input)
Printf("输入的长度为:%d\n", len(input))
Printf("输入的字符为: %s\n", input)
Printf("输入的字符的编码为:%d\n", input[0])
}
}
操作結果は次の
とおり
です。ASCIIコード26の文字は次のとおりです。コンソールのGoプログラムにCtrl + Zを入力すると、元のコードは26になります。次に、以前のコードを次のように改善します。
import (
. "fmt"
"strings"
)
func main() {
var input string
for {
_, _ = Scanf("%s\r\n", &input)
var eof rune = 26
if strings.Contains(input, string(eof)) {
Printf("输入结束\n")
break
}
}
}
このようにして、Ctrl + Zで入力を正常に終了できます。