2012-04-17 43 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。