入力の終了を制御するためにGolangのC言語でif(scanf(...)== EOF)をシミュレートする方法

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で入力を正常に終了できます。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_52698632/article/details/113625296