簡體   English   中英

當我在STDIN中輸入一個長字符串時,Swift的readLine()為nil

[英]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_MAX2^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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM