2013-08-17 48 views
0

我有一個任務使用我想要的任何語言構建一個兩遍彙編程序。我選擇了python。除了一個簡短的問題,它對我很好。比較Python中兩個字符串的邏輯錯誤

我使用.asm輸入文件構建了一個符號表。然後我使用符號表來創建目標代碼。我下面的代碼給出:

import re,os 
import ast 
fr=open("2input.asm","r") 
fw=open("symbol.txt","r+") 
objFile=open("symbol1.txt","w") 

str2=fr.readline() #reads lines in file 
temp="" 
str1="" #used for splitting original string 
var="" 
var1="" 
printstr="" 
location=map(int, re.findall('\d+',str2)) #extracts location in the form of string and then converts it to integer 
loc=location[0] #converts location from list form to integer form 


for line in fr:   #creates a symbol table 
    str2=line 
    loc=loc+1 
    if str2.find(":")!=-1: 
     str1=str2.split(":") 
     str1.append(str(loc)) 
     print>>fw, str1 
    elif str2.find("DC")!=-1: 
     str1=str2.split("DC") 
     str1.append(str(loc)) 
     print>>fw, str1 
    elif str2.find("DS")!=-1: 
     str1=str2.split("DS") 
     str1.append(str(loc)) 
     print>>fw, str1 
#symbol table created 
fw.seek(0) 
fr.seek(0) 

for line in fr:   #creates object file 
    str2=line 
    if str2.find("READ")!=-1: 
     str1=str2.split() 
     var=str1[1] 
     for line in fw: 
      var1=ast.literal_eval(line) 
      var2=var1[0] 
      if var==var2: #it never goes in this if even if the condition is true 
       printstr="rohit" 
       print>>objFile, printstr 
fw.close() 

在過去,如果條件我已經使用了AST庫一個字符串,它是在列表格式列表中的數據類型轉換。
控制永遠不會在最後如果,爲什麼會發生?控制如何進入if?即使兩個字符串相同,控件也不會進入if。爲什麼會發生?

「symbol.txt」文件包含一些行,所有行都以列表格式存儲。這些行由ast語句轉換爲列表數據類型。編輯:
我得到了問題。顯然,ast語句在將字符串轉換爲list dataype的同時添加了一些額外的空格,導致僞造if條件。我改變了if條件:

if var1 in var2: 
    #do my job 
+0

最有可能的情況是不正確的。打印出'var1'和'var2'的字符串表示形式和類型,看看是否有區別。 – viraptor

+0

你知道你不需要聲明你的變量,對吧?在初始化一堆變量到''「'的開始,這部分是怎麼回事? – user2357112

+0

@viraptor我已經試過你說的,這兩種類型都是字符串。 –

回答

2

如果條件爲真,if語句中的代碼將會絕對執行。你可以肯定的。因此,情況根本不可能是真實的。在不知道你的數據是什麼樣子的情況下,確實無法確定。最有可能的值看起來相同,但他們根本不可能。

因此,從價值觀不等的前提出發,回答「如果不相等,爲什麼不相等?」的問題。例如,您可以打印出每個變量的類型,每個變量的長度,或者您可以編寫一個小函數來逐個比較每個字節,以查看哪一個不同。可能有一個看不見的無形字符(可能是前導空格或尾部空格,或者可能是諸如回車的控制字符),或者存在非常相似的可見字符(例如數字1和小寫字母L或大寫O(哦)和數字0(零))。

+0

即使我認爲同樣的事情,我甚至已經過檢查類型是否相同。但它根本沒有幫助。 ast聲明是否可能導致問題? –

+0

我認爲你是對的。我會試試 –

+0

你是對的。有我看不到的特殊字符。謝謝你的協助。 –