2012-08-01 61 views
3

所以我最近一直在嘗試D,因爲我知道很多程序員都推薦我通過C++學習它。開關語句總是解析爲默認值而不是案例

我使用的DMD編譯器v2.057,這是我的代碼:

while(cliLoopC) 
{ 
    write("?> "); 
    string iPt_ = std.string.tolower(readln()); 
    switch (iPt_) 
    { 
     default: writeln(E_URECCOM); break; 
     case "test": 
      writeln("Hello!"); 
      break; 
    } 
} 

的程序是,每當我在test類型,所以它應該去case而不是default ,它只是打印E_URECCOM(這是一個常量字符[],其中包含UNRECOGNISED COMMAND\n)的內容。

我沒有看到發生了什麼事情使它做到這一點。有任何想法嗎?

+2

開關語句總是輸入第一個可能的匹配,然後繼續通過其他案例標籤,直到他們找到中斷或結束。這就是爲什麼默認應該結束。 – RedX 2012-08-01 00:19:31

+1

@RedX剛剛測試過,默認情況下不是這樣(至少在DMD的情況下)。對於常規情況下的情況,情況確實如此(也經過測試)。默認可以去任何地方,但是它的約定(在我看來,這是很好的理由)將它貼在底部。 – eco 2012-08-01 00:31:45

+0

雖然這看起來很愚蠢。沒有辦法像這樣......無論如何,在頂部看到'default'是非常具有誤導性的。 – Mehrdad 2012-08-01 00:51:59

回答

4

編輯: Adam D. Ruppe的答案是在說正確答案:

是的,有在readln結束一個\ n。嘗試使用std.string.strip(readln());

我只是想扔在那裏,因爲我的回答仍然有檢查

我的回答: 默認情況下是捕獲所有的情況下,這樣看起來最佳(普通的)在年底

這樣

while(cliLoopC) 
{ 
    write("?> "); 
    string iPt_ = std.string.tolower(readln()); 
    switch (iPt_) 
    { 
     case "test": 
      writeln("Hello!"); 
      break; 
     default: writeln(E_URECCOM); break; 
    } 
} 
+2

我相當確定這是錯誤的。文檔中的一個示例甚至與此答案相矛盾:http://dlang.org/statement.html#SwitchStatement – BCS 2012-08-01 14:02:56

+0

請注意,使用該方法時不會有中斷。在文檔中,他們希望它每次都被擊中,然後繼續到其他情況 – 2012-08-01 16:31:43

+0

,否則我可能會錯誤... – 2012-08-01 16:34:11

6

嗯...我還沒有嘗試過d,但也許readln()被包括CR,LF或CR/LF在字符串的結尾,它應該是包括在c中比較字符串?

case「test \ n」:

13

是的,在readln結尾處有一個\ n。嘗試使用std.string.strip(readln());