2013-11-24 26 views
0

我正在爲用於爲我們的教科書設計的虛擬計算機使用的彙編程序編寫一些c代碼。重點是讓二進制輸出看起來與在通過伴隨教科書的程序中運行程序集之後看起來一樣。我在最後一條指令轉換爲二進制,BR(分支),並與sscanf有一些麻煩。該功能,sscanf將0添加到我的字符串中

char* br(char* line) { 
int num, i, l, n = 0, z = 0, p = 0; 
char bin[17] = "0000"; 
char word[20], arg1[20]; 

sscanf(line, "%S%S", word, arg1); 
l = strlen(word); 
for (i = 2; i < l; i++) { 
    if (word[i] == 'N') { 
     n = 1; 
    } else if (word[i] == 'Z') { 
     z = 1; 
    } else if (word[i] == 'P') { 
     p = 1; 
    } 
} 
bin[4] = n + '0'; 
bin[5] = z + '0'; 
bin[6] = p + '0'; 

while (label[i] != 0) { 
    if (strcmp(label[i], arg1) == 0) { 
     num = address[i] - currentAddress - 1; 
     decToBinary(num, arg1); 
     break; 
    } 
    i++; 
} 

for (i = 7; i < 16; i++) { 
    bin[i] = arg1[i]; 
} 
return bin; 
} 

我遇到的問題是,sscanf的是增加置於字和ARG1每個字符之間0的所以他們被終止。輸入的字符串「BRZP START」分別被分爲字「B」和分別爲arg1的「S」。我已經用這種方式使用sscanf了,不知道爲什麼現在不工作。

+0

你用'%s%s'之間的空格試過了嗎? –

回答

0

如果你看看man page的sscanf,看起來%S(大寫字母S)並不代表什麼(基於printf手冊頁,它看起來好像等價於「ls」,它讀取寬字符而不應該被使用,當一個短字符串被轉換爲一個長字符串時,每一個第二個字符看起來都等於零)。試試這個:

sscanf(line, "%s%s", word, arg1); 
+1

OP使用'「%S%S」',你的解決方案明智地建議使用'%s'而不是'%S'。但增加的空間是不需要的。 '%s'全部準備跳過領先的空白。 '「%s%s」'更接近OP的風格。 – chux

+0

很好的建議,改變了 –

+0

糟糕!當我使用「已經」時,我建議沒有空間並且使用「全部準備好」。 – chux

0

不指定您正在使用的主機操作系統和開發平臺,但我絲毫不感到有些意外你得到兩個字節考慮%S告訴sscanf每個字符在一些實現中讀取寬字符。如果你的輸入是ASCII,你會得到ASCII字符加上一個空字節,就像你看到的一樣。解決方案很簡單:使用%s而不是%S