为什么我的字符串为零?

Why is my string nil?

我制作了这个读取字符直到按下回车键的简单程序

var data: string

while true:
    var c = readChar(stdin) # read char

    case c
    of '\r': # if enter, stop
    break
    else: discard

    data.add(c) # add the read character to the string

echo data

但是当它尝试 echo data 时,它崩溃了

> ./program
hello
Traceback (most recent call last)
program.nim(11)          program
SIGSEGV: Illegal storage access. (Attempt to read from nil?)

这意味着 data 为零。但是每次我按下输入一个字符时,它都会将该字符添加到 data。出了点问题,但哪里出了问题?

当您将其定义为 var data: string 时,数据最初为 nil。相反,您可以使用 var data = "" 使其成为初始化字符串。

stdin缓冲所有字符,直到按下换行键,然后它才会提交字符。我预计行为会直接读取字符。

这意味着 \r 永远不会是这种情况,它将尝试向 data 添加一个字符,但数据是 nil,因此失败。我认为它在 echo 声明中失败了。

为了演示,这段代码有效:

var data = ""

while true:
    var c = readChar(stdin) # read char

    case c
    of '\e': # if escape, stop
        break
    else:
        data.add(c) # add the read character to the string

echo data