当我在STDIN中输入一个长字符串时,Swift的readLine()为nil

Vla*_*Nul 3 swift

我试图解决这个 HackerRank的有关动态规划问题.我想我已经找到了一个解决方案,可能效率不高,但我仍在努力.

我提交了我的代码并且无法通过大型测试用例,因此我尝试使用该测试用例自行测试.问题是当我输入输入数据Xcode没有响应时,它不会崩溃,但它不会继续执行代码.

首先,我使用此代码读取包含n个以空格分隔的整数的单行,在本例中为68,738.

let arr = readLine()!.characters.split(" ").map({ Int(String($0))! })
Run Code Online (Sandbox Code Playgroud)

经过一段时间(几秒钟,甚至几分钟),代码崩溃,说它在展开一个可选值时发现了nil.

所以我尝试将该指令拆分如下:

let input = readLine()!
let arr = input.characters.split(" ").map({ Int(String($0))! })
Run Code Online (Sandbox Code Playgroud)

在这里,我希望代码在第二行崩溃,尝试将输入字符串映射到整数数组.但是在尝试readLine()时代码崩溃了.输入字符串长370,112.

我也尝试使用此代码以至少获取字符串输入:

let input = readLine()
let arr = input!.characters.split(" ").map({ Int(String($0))! })
Run Code Online (Sandbox Code Playgroud)

但输入是零.我假设输入字符串太长,但在32字节CPU上不应该是2,147,483,648?我猜这个空间够了吧?

我用google搜索readLine()是否有任何限制但没有找到任何限制.我会尝试用另一种语言解决这个问题,但我真的很想在Swift中解决这个问题.有没有我没看到的东西?

Mar*_*n R 9

readLine()是stdio getline函数的包装器,该函数只需要SSIZE_MAX在输入的第一个字符内出现换行符.在64位OS X平台,SSIZE_MAX2^63 - 1这意味着此只是理论上的限制.

所以readLine()不是问题,它可以读取任意长行,只要它们适合您的计算机内存.

但似乎你不能将超过1023个字符粘贴到Xcode调试器控制台中.(编辑:在C++读取非常长的控制台输入时也观察到了这一点).

通过文件中的输入重定向在终端中运行程序是解决问题的一种方法:

$ ./myProgram < /path/to/inputData.txt
Run Code Online (Sandbox Code Playgroud)

另一种选择是添加

freopen("/path/to/your/inputData.txt", "r", stdin)
Run Code Online (Sandbox Code Playgroud)

在Swift计划的开头.这会将标准输入重定向到从给定文件中读取.这种方法的优点是你仍然可以在Xcode中调试你的程序.