2012-04-17 11 views
0

配列に新しいchar値を与えることに問題があります。 nが12であっても "<"と表示される理由は分かりません。私のプログラムは、12の式int char* tab = "93+"を1つの値に変更する必要があります。スイッチに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 *)'はあなたがやっていることです。 –

+1

したがって、 'strlen(tab)'を使用してください。 '" "'で与えられた文字列も自動的に '\ 0'で区切られます。 –

+1

gotoよりも優れたものを使うことができる確率は非常に高いです。 – chris

答えて

1

問題は、この行にあります!

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

nが12であるが、12 + '0' = '12'、 '12' ので、文字ではありません。あなたはASCII値が12以上の '0'より大きいcharをtmp [i]に入れています。これは '<'です。
私は、intとしてtmpを宣言して(扱うのが)あなたの目的にとってはより良いと信じています。

はまた、あなたは常に(32ビットマシンで)b==4を取得する可能性が高いですのでsizeof (tab)は、sizeof ("93+")sizeof (char *)と同じ、とではないことに注意してください。

+0

私は '(char)n'やjut' n'と書くことを試みますが、それは同じ効果です。 – mathewM

+0

これは、キャスティングが自動的に行われるはずです。しかし、'12 'は文字ではありません。 ascii表を見ると、 '' 0 '== 48'という意味で、 '' 0' + 12 == 60'、 ''<' == 60'という意味になります。 例としてascii表があります:http://www.asciitable.com/index/asciifull.gif –

0

あなたは本当に '<'を取得する必要があります。理由は次のとおりです。tmpは、文字の配列です。あなたはnを12と計算しました。これは正しいです。次に48に48を加えた0が追加されました。つまり、60をtmp [i]に保存します。 ASCII 60は '<'です。

int tmpを使用し、 '0'を追加しないと、tmp [i]に12を追加できます。

関連する問題