2012-04-17 45 views
0

我給給數組賦予新的字符數有問題。即使當n是12時,我也不知道爲什麼我會得到「<」符號?我的程序應該將表達式int char* tab = "93+"更改爲這種情況下的一個值12切換並向數組添加char值

char* tab = "93+"; 
    int b = sizeof (tab); 
    char* tmp = new char[b] ; 
    tmp [b-1] = '\0'; 


if(isdigit(tab[i]) && isdigit(tab[i+1])){ 
       int n;    
       if(tab[i+2]=='+' || tab[i+2]=='-' || tab[i+2]=='*'){ 

        switch(tab[i+2]){ 
        case '+': 
        n = (tab[i]-'0') + (tab[i+1]-'0'); 

        break; 

        case '-': 
        n = (tab[i]-'0') - (tab[i+1]-'0'); 
        break; 

        case '*': 
        n = (tab[i]-'0') * (tab[i+1]-'0'); 
        break; 
        } 
        tmp[i] = n+'0'; // I should have 12 but I get < 
       } 

       else if (tab[i+2]!='+' || tab[i+2]!='-' || tab[i+2]!='*'){ 
        goto LAB; 
       } 
} 
+2

大家知道,'sizeof(tab)'將永遠是指針的大小,而不是它指向的字符的數量,所以這是錯誤的。 'sizeof(some_array)'會給你元素的數量,'sizeof(char *)'就是你正在做的事情。 – 2012-04-17 18:04:36

+1

所以使用'strlen(tab)'。在'「」'中給出的字符串也自動以'\ 0'分隔。 – 2012-04-17 18:07:13

+1

你可以使用比goto更好的東西的可能性非常高。 – chris 2012-04-17 18:09:09

回答

1

的問題是在這條線:

tmp[i] = n+'0'; // I should have 12 but I get < 

n爲12,但12 + '0'= '12' 中,由於 '12' 不是字符!您將tmp [i]中的ASCII值設置爲大於'0'的12個字符,即'<'。
我相信將tmp聲明爲(並將其視爲int)會更適合您的目的。

還要注意的是sizeof (tab)相同sizeof (char *),並沒有sizeof ("93+"),那麼你可能總是b==4(在32位機器)。

+0

我嘗試寫:'(char)n'或突出'n',但它是相同的效果。 – mathewM 2012-04-17 18:26:46

+0

它應該是 - 鑄件自動發生。然而,'12'不是一個角色。如果你看一個ASCII表,你會看到'0'== 48',這意味着''0'+ 12 == 60'和''''== 60'。 下面是一個ascii表格作爲示例:http://www.asciitable.com/index/asciifull.gif – 2012-04-17 18:32:00

0

你的確應該得到'<'。這是爲什麼:tmp是一個字符數組。你計算n爲12.這是正確的。然後你添加了'0',即48 48 + 12 = 60.所以你在tmp [i]中存儲60。 ASCII 60是'<'。

您可以使用int tmp,而不是添加'0',然後您將在tmp [i]中獲得12。