[英]Swift's readLine() is nil when I enter a long string in STDIN
我試圖解決這個 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? 我猜這個空間夠了吧?
我用google搜索readLine()是否有任何限制但沒有找到任何限制。 我會嘗試用另一種語言解決這個問題,但我真的很想在Swift中解決這個問題。 有沒有我沒看到的東西?
readLine()
是stdio getline
函數的包裝器,該函數只需要在輸入的第一個SSIZE_MAX
字符內出現換行符。 在64位OS X平台上, SSIZE_MAX
為2^63 - 1
,這意味着這只是理論上的限制。
因此readLine()
不是問題,它可以讀取任意長行,只要它們適合您的計算機內存。
但似乎你不能將超過1023個字符粘貼到Xcode調試器控制台中。 ( 編輯: 在C ++中讀取非常長的控制台輸入時也觀察到了這一點)。
通過文件中的輸入重定向在終端中運行程序是解決問題的一種方法:
$ ./myProgram < /path/to/inputData.txt
另一種選擇是添加
freopen("/path/to/your/inputData.txt", "r", stdin)
在Swift計划的開頭。 這會將標准輸入重定向到從給定文件中讀取。 這種方法的優點是你仍然可以在Xcode中調試你的程序。
正如@MartinR所提到的那樣,問題是我試圖用Xcode測試它,這似乎對輸入字符串有一些限制。 我試過終端,它的工作方式應該如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.