2016-07-08 84 views
2

我正試圖解決this HackerRank有關動態編程的問題。我想我已經提出了一個解決方案,可能效率不高,但我仍在嘗試。當我在STDIN中輸入一個長字符串時,Swift的readLine()是零

我提交了我的代碼,它未能通過一個大的測試用例,所以我試圖使用該測試用例來測試它自己。問題是當我輸入輸入數據時Xcode不響應,它不會崩潰,但它不會繼續執行代碼。

首先我有這段代碼來讀取一行包含n個空格分隔的整數,在這種情況下是68,738。

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

過一段時間(幾秒鐘,甚至也許分鐘)的代碼崩潰說,它發現了零,而展開的可選值。

於是,我就和拆分指令如下:

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中做到這一點。有沒有我沒有看到的東西?

+0

是的,線路長度有限制,請參閱http://unix.stackexchange.com/questions/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminal例如 總之,這種方法不適用於大數據。 – Sulthan

+0

我剛剛測試了> 30MB輸入文件的readLine(),沒有問題。你確定readLine()是罪魁禍首嗎? –

+0

@Sulthan:'readLine()'使用stdio ['getline'](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/getline.3.html)函數,並且唯一的「限制」是在第一個SSIZE_MAX = 2^63-1字節中必須出現換行符。 –

回答

7

readLine()是圍繞標準輸入輸出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) 

。這將輸入的標準 重定向到從給定文件讀取。 這種方法的優點是你仍然可以在Xcode中調試你的程序 。

+0

謝謝,這是一個很好的方法,甚至更好的解決方案 –

1

正如@MartinR所提到的,問題是我試圖用Xcode來測試它,這似乎對輸入字符串有一些限制。我從終端試過,它的工作方式應該是這樣。

相關問題