使用char数组减去2个数字

时间:2011-12-15 17:36:52

标签: c arrays char

我想减去两个具有数值的char数组。我这样做是因为我想减去大数字。当我编译这个程序时,它没有显示任何错误,但在执行中它崩溃了。 我试着做如下伪代码

foreach character(right2left)
    difference=n1[i]-n2[i]//here suppose they are integers
    if(difference<0)
    {
        n1[i-1]--;
        difference+=10;
    }
    result[i]=diff;

为了清楚起见,我编写了伪代码。

 int subtract(char *n1,char *n2,int n1Len,int n2Len){
 int diff;  
    int max=n1Len;
  char* res = (char*)malloc (max+2);
    memset(res, '0', max +1); 

    res[max] = '\0';
    int i=n1Len - 1, j = n2Len - 1, k = max;
    for (; i >= 0 && j >=0; --i, --j, --k) {
    if(i >= 0 && j>=0)
    {
            diff=(n1[i]-'0') - (n2[i]-'0') ;
        if(diff<0)
        {
        int temp=n1[i-1]-'0';
        temp=temp-1;
        n1[i-1]=temp+'0';
        diff+=10;
        }
        res[i]=diff+'0';
   }
  else 
         res[i]=n1[i];

    }
    return atoi(res);
 }


int main(void) {
    int t=subtract("55","38",2,2);
    printf("%d\n", t);
}

4 个答案:

答案 0 :(得分:2)

    char* res = (char*)malloc (max);
    memset(res, '0', max-1);      // set the result to all zeros
    res[max] = '\0';

我们说max是3 您将res[0]res[1]设置为0.然后将不存在的res[3]设置为0。 res[2]仍未初始化。

请尝试calloc,不要忘记零字符串终止符的空格:)

此外,从malloc(或calloc)转换返回值至多是多余的,并且可能隐藏编译器在没有强制转换时会捕获的错误。

    char *res = calloc(max + 1, 1); // allocate and initialize to 0

答案 1 :(得分:2)

有一些明显的错误。希望这些能为您提供一些指导:

  1. 您正在将字符串文字传递给函数&amp;试图在函数中修改它们。这是无效的,很可能会导致分段错误。而不是int t=subtract("55","38",2,2);也许你可以尝试:
    char a[] = "55";
    char b[] = "38";
    int t=subtract(a,b,strlen(a), strlen(b));

  2. max应为n1Len+1,以适应NUL字符数组中的终止res字符。初始化时,您可以将其设置为0而不是'0'res[max] = '\0';在访问超出绑定元素时调用未定义的行为,摆脱它。所以请改用memset(res,0,max)。或者按照@pmg的建议使用calloc代替malloc + memset

  3. 在C语言编码时,不要对malloccalloc的返回值进行类型转换

  4. for (; i >= 0 || j >=0; --i, --j, --k)实际应该是for (; i >= 0 && j >=0; --i, --j, --k),因为ij都不应该是0。您需要处理i!=j

  5. 的函数逻辑
  6. diff=n1[i]-'0'+n2[i]-'0'应为diff=(n1[i]-'0') - (n2[i]-'0'),因为您正在减去而不是添加数字

  7. res[i]=diff不正确,因为您将整数结果设置为字符值。将其更改为res[i]=diff+'0'以设置字符值

  8. 希望这会让你开始。
    希望这有帮助!

答案 2 :(得分:1)

diff=n1[i]-'0'+n2[i]-'0';

应该是差异

diff = (n1[i] - '0') - (n2[j] - '0');

(除了减去而不是添加,n2的索引应该是j,我认为)。添加后,您可以在结果中获得非数字字符,atoi()在第一个字符处停止,如果是第一个,则返回0.

此外,您应该检查n2确实不超过n1,否则您将写出界限。

答案 3 :(得分:0)

diff=n1[i]-'0'+n2[i]-'0';

这没有区别。它应该是

diff = (n1[i] - '0') - (n2[j] - '0');