我想减去两个有数值的字符数组。我这么做是因为我想减去大数。当我编译这个程序时,它不会显示任何错误,但在执行过程中会崩溃。
我试着用下面的伪代码

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);
}

最佳答案

有一些明显的错误。希望这些将为您提供一些提示:
您正在将字符串文本传递给函数并试图在函数中修改它们。这是无效的,很可能会导致分割错误。也许你可以尝试:
int t=subtract("55","38",2,2);
char a[] = "55";
char b[] = "38";
int t=subtract(a,b,strlen(a), strlen(b));应该max以适应n1Len+1字符数组中的终止字符。初始化时可以将其设置为NUL,而不是res0在访问超出绑定的元素时调用未定义的行为,将其删除。所以改用'0'。或者使用res[max] = '\0';而不是@pmg建议的memset(res,0,max)+calloc
在C中编码时,不要键入mallocmemset的返回值
malloc实际上应该是calloc,因为for (; i >= 0 || j >=0; --i, --j, --k)for (; i >= 0 && j >=0; --i, --j, --k)都不应该是i。您需要处理函数逻辑,其中j
0应该是i!=j因为您是减去而不是加上数字
diff=n1[i]-'0'+n2[i]-'0'不正确,因为您将整数结果设置为字符值。将其更改为diff=(n1[i]-'0') - (n2[i]-'0')以设置字符值
希望这能帮你开始。
希望这有帮助!

关于c - 使用char数组减去2个数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8524274/

10-12 23:30