c - 使用 char 数组减去 2 个数字

标签 c arrays 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);
}

最佳答案

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

  1. 您将字符串文字传递给函数并尝试在函数中修改它们。那是无效的,很可能会导致段错误。而不是 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 以容纳 res 字符数组中的终止 NUL 字符。您可以在初始化时将其设置为 0 而不是 '0'res[max] = '\0'; 当您访问超出绑定(bind)的元素时调用未定义的行为,摆脱它。因此,请改用 memset(res,0,max)。或者使用 calloc 而不是 @pmg 建议的 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. diff=n1[i]-'0'+n2[i]-'0' 应该是 diff=(n1[i]-'0') - (n2[i]-'0') 因为您要减去而不是添加数字

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

希望这能帮助您入门。
希望这对您有所帮助!

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

相关文章:

c - 重新分配错误 : incorrect checksum for freed object

c - 在多维数组中存储和检索字符串

c++ - 在 C++ 中将 Char 转换为 Int 的问题

c# - 将字符串从 C# 传递到 C DLL

c - 如何在c中缩放数字/数字范围

c - Visual Studio 2015 C++ - 外部头文件

c - 需要解决 "multiple definition"错误的方法

javascript - 缺少数组

c# - 为什么没有像 String.Empty 这样的 Char.Empty?

c - 是否可以根据是否在 C 中定义头文件来添加某些代码部分?