2017-03-20 29 views
0

該程序計算一個字符串在一個較大字符串中重疊出現次數。調試並運行給出不同的輸出python

輸入:

  • 較大的字符串(VAR名稱:search_space)< < ABABABA

  • 小串(VAR名稱:SEARCH_STRING)< < ABA

回答在Pycharm 2016.3:中使用'調試代碼'

搶答Pycharm 2016.3使用 '運行代碼':7

預期的答案:3

我的代碼:

import sys 

def count_substring(search_space, search_string): 
    search_space = search_space.lower() 
    search_string = search_string.lower() 

    if search_space: 
     search_space = search_space.split('\n')[0] 
    if search_string: 
     search_string = search_string.split('\n')[0] 
    lower = 0 
    upper = len(search_string) 
    curr = ' ' 
    count = 0 
    for curr in search_space: 
     selected = search_space[lower:upper] 
     if search_string == selected: 
      count += 1 
     lower += 1 
     upper += 1 
     if upper > len(search_space): 
      break 
    return count 

if __name__ == '__main__': 
    s = sys.stdin.read() 
    t = sys.stdin.read() 
    occurance_count = count_substring(s, t) 
    sys.stdout.write(str(occurance_count)) 

的代碼進行了修改,以幫助闡明錯誤:

for idx, curr in enumerate(search_space): 
    print(idx, curr) 
    print(count) 
    selected = search_space[lower:upper] 

Outpu T使用 '調試代碼':(按預期運行)

>? abababa <ENTER> 
>? aba <ENTER> 
0 a 
0 
1 b 
1 
2 a 
1 
3 b 
2 
4 a 
2 
3 

輸出使用 '運行代碼':

abababa 
aba 
^D 
0 a 
0 
1 b 
1 
2 a 
2 
3 b 
3 
4 a 
4 
5 b 
5 
6 a 
6 
7 

注: ^ d即按Ctrl + d,按下因爲運行期間按ENTER插入換行符。 Ctrl + D是我設法讓剩餘代碼運行的唯一方法。但即使沒有CTRL + D,在完成代碼的遠程測試時(這是自我導向的非證書課程的一部分),仍然存在差異。

注意:我必須在本練習中使用標準輸入和輸出。

在我看來,使用for curr in search_space:正在使循環在search_space的整個長度內迭代,因此比它應該更多次。

爲什麼Break命令不起作用?

我的問題:

  1. 這究竟是爲什麼?
  2. &我會閱讀哪些概念以瞭解並預見此類事件?
  3. 爲什麼調試和運行模式中的差異?
  4. 我如何在未來的代碼中預見和防止這個錯誤?
  5. 有沒有比Ctrl + D更好的運行方式?這個粗略的技巧在終端或IDLE中不起作用。
+0

您從標準輸入讀取兩次:'sys.stdin.read()'。該方法從該流中讀取直到其結束(而不是像在「運行」示例中那樣結束行)。它只能被調用一次,之後你不應該觸碰stdin。 –

+0

謝謝埃爾瑪! 我意識到一些錯誤,因爲len(search_string)爲零。 readline()會更好嗎? 如果我確實使用read(),我如何在s和t之間分配輸入? –

+0

是的,或者使用'readline()'或者之後用'split(「\ n」)將輸入拆分成幾行' –

回答

0

該代碼從stdin讀取兩次:sys.stdin.read()。該方法從該流中讀取直到其結束(不像「運行」示例中的行結束)。它只能被調用一次,之後你不應該觸摸stdin

如果您想逐行讀取輸入行,請使用sys.stdin.readline()

0

Elmar Peise評論:
您從標準輸入讀取兩次:sys.stdin.read()。該方法從該流中讀取直到其結束(而不是像在「運行」示例中那樣結束行)。它只能被調用一次,之後你不應該觸碰stdin。

Qubit寫道:
我用readline()替換了read(),它全部解決了。
如果任何人有更多有用的掘金分享請這樣做,並感謝你,但我現在特別的困境已經解決,所以標記爲答案。
謝謝Elmar!