【问题标题】:Swift's readLine() is nil when I enter a long string in STDIN当我在 STDIN 中输入长字符串时,Swift 的 readLine() 为零
【发布时间】:2016-07-08 20:42:28
【问题描述】:

我正在尝试解决this HackerRank 关于动态规划的问题。我想我已经有了一个解决方案,可能不是很有效,但我仍在尝试。

我提交了我的代码,但它未能通过一个大型测试用例,所以我尝试使用该测试用例自己测试它。问题是当我输入输入数据时 Xcode 没有响应,它没有崩溃,但它不会继续执行代码。

首先,我让这段代码读取包含 n 个空格分隔的整数的单行,在本例中为 68,738。

let arr = readLine()!.characters.split(" ").map({ Int(String($0))! })

几秒钟后(几秒钟,甚至几分钟),代码崩溃了,说它在展开可选值时发现了 nil。

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

let input = readLine()!
let arr = input.characters.split(" ").map({ Int(String($0))! })

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

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

let input = readLine()
let arr = input!.characters.split(" ").map({ Int(String($0))! })

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

我用谷歌搜索了 readLine() 中是否有任何限制,但一无所获。我会尝试用另一种语言解决这个问题,但我真的很想用 Swift 来解决这个问题。有什么我没有看到的吗?

【问题讨论】:

  • 是的,行长是有限制的,例如看unix.stackexchange.com/questions/131105/… 总而言之,这种方法不适用于大数据。
  • 我刚刚用 > 30MB 的输入文件测试了 readLine(),没有问题。你确定 readLine() 是罪魁祸首吗?
  • @Sulthan: readLine() 使用 stdio getline 函数,并且唯一的“限制”是换行符必须出现在第一个 SSIZE_MAX = 2^63-1 字节中。跨度>
  • @MartinR 你能尝试从标准输入而不是文件读取吗?
  • @VladimirNul:我用./testProg < filecat file | ./testProg 对其进行了测试,其中file 包含一个非常长的行。 readLine 从标准输入读取,并从文件重定向。

标签: swift


【解决方案1】:

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

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

但您似乎不能将超过 1023 个字符粘贴到 Xcode 调试器控制台。 (编辑:Read a very long console input in C++ 也观察到了这种情况。

使用来自文件的输入重定向在终端中运行程序是解决问题的一种选择:

$ ./myProgram < /path/to/inputData.txt

另一种选择是添加

freopen("/path/to/your/inputData.txt", "r", stdin)

在 Swift 程序的开头。这重定向了标准 从给定文件中读取的输入。 这种方法的好处是你仍然可以调试你的程序 在 Xcode 中。

【讨论】:

  • 谢谢,这是一个很好的方法,甚至是更好的解决方案
【解决方案2】:

正如@MartinR 所提到的,问题是我试图用 Xcode 进行测试,这似乎对输入字符串有一些限制。我从终端尝试过,它按应有的方式工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    • 2021-11-02
    • 2013-02-05
    相关资源
    最近更新 更多