2013-03-20 62 views
0

我正處於使用C++編寫程序的早期階段,它用其英文對應項替換整數輸入。我不想要關於如何製作這個程序的說明,而是想知道某個部分代碼如何以某種方式行爲,並且可能會提示如何解決這個問題。C++ - 使用臨時變量的索引數組

std::string strToEng(std::string s) 
{ 
    int sInt = atoi(s.c_str()); 


    std::string digit1[] = {"zero", "one", "two", "three", "four", "five", "six", "seven", 
          "eight", "nine", "ten", "eleven", "twelve", "thirteen", 
          "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", 
          "nineteen"}; 

    switch(s.size()) 
    { 
    case 1: 
    { 
     int temp = int(s[0]); 
     return digit1[temp]; 
    } 
    } 

    return "error"; 
} 

問題在於switch語句中的digit1數組。當我編譯此代碼時,情況1不會返回所需的輸出。如果我將digit1 [temp]更改爲某種常數(即digit1 [3]),它會正確顯示。使用變量來索引數組是否存在問題?我該如何解決這個問題?

編輯:也許欺騙,我沒有辦法處理數字高於九,但他們仍然包含在digit1。原因是這段代碼被重寫了好幾次。

+2

*「使用變量來索引數組是否存在問題?」主,我希望不會。 – WhozCraig 2013-03-20 20:06:41

+1

問題看起來像它與你的轉換'int(s [0])'有關。這對我來說看起來像一個強制轉換,它簡單地將char字節解釋爲int,這取決於ascii值。 '1'與1不一樣。您將需要使用某種方法將該字符轉換爲int。 (我看你已經在你的代碼中使用atoi) – Porkbutts 2013-03-20 20:09:24

+0

'int temp = int(s [0]);'???打開s.size()?不是很好。 – 2013-03-20 20:09:36

回答

2

你應該使用digit1[sInt]如您已經轉換爲字符串轉換成int值...

s[0]只是字符串的第一個字符,所以如果第一個字符是'0'那麼它的值是48(見ASCII表格),然後你訪問你桌子的第49個元素......在你的案例1中,你可以嘗試int(s[0])-'0',它應該可以工作。

+0

啊,謝謝!我沒有考慮到這一點。這似乎是最好的解決方案。我沒有使用sInt來達到這個目的(事實上我以爲我把它刪除了......),因爲我打算擴展這個來處理多個數字。 – Do8fe7aevol4lopo 2013-03-20 20:18:47

+0

@Steven J Wayne Esq:atoi已經可以爲你處理多個數字了。 – 2013-03-20 20:21:05

0

您將s的第一個字符轉換爲int,所以如果s包含一個數字,則該值位於48到57的十進制數字的ASCII值範圍內。爲什麼不使用正確創建的int sInt你的函數的第一行?