当前位置: 首页 > 知识库问答 >
问题:

leetcode - LeetCode 43 题字符串相乘数组初始化为什么失败呢?

郜驰
2024-02-18

LeetCode 43题字符串相乘,乘好后的结果无法放入数组,且初始化并不成功,每次想将数组初始化的时候都会报错。

尝试了用calloc,memset,for循环对数组进行初始化,但是都失败了,直接定义进行初始化也不行,不知道是什么原因?

题目描述:
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

我的代码:

void reverseString(char* str) {       int length = strlen(str);    int start = 0;    int end = length - 1;    while (start < end) {           char temp = str[start];        str[start] = str[end];        str[end] = temp;        start++;        end--;    }}char* multiply(char* num1, char* num2) {    int len = 0;    int len1 = 0;    int len2 = 0;    int temp = 0,t = 0;    int i = 0,j = 0;    len1 = strlen(num1);    len2 = strlen(num2);    char* shortAns = (char*)malloc(sizeof(char) * 2);    shortAns[0] = '0';    shortAns[1] = '\0';    if((len1 == 1 && num1[0] == '0') || (len2 == 1 &&num2[0] == '0'))        return shortAns;    int* A = (int*)malloc(sizeof(int) * len1);    int* B = (int*)malloc(sizeof(int) * len2);    for(i = len1 - 1;i >= 0;i--)        A[i] = num1[i] - '0';    for(i = len2 - 1;i >= 0;i--)        B[i] = num2[i] - '0';    //int* ans = (int*)calloc((len1 + len2 + 1),sizeof(int));    int* ans = (int*)malloc(sizeof(int) * (len1 + len2));    //memset(ans, 0, sizeof(int) * (len1 + len2 + 1));    ans[0] = 0;    ans[1] = 0;    for(i = 0;i < len1;i++){        for(j = 0;j < len2;j++){            t = i + j;            ans[t] += A[i] * B[j];            printf("A*B = %d,ans[%d] = %d\n",A[i] * B[j],t,ans[t]);            //ans[i + j] += temp;        }    }    for(int i = 0;i < len1 + len2;i++){        temp += ans[i];        ans[i] = temp % 10;        temp /= 10;    }    int k = len1 + len2 - 1;    while(k > 0 && ans[k] != 0)//去掉最高位的0        k--;    char* res = (char*)malloc(sizeof(char) * (len1 + len2));    while(k >= 0){        res[len++] = ans[k--] + '0';        //printf("ans[%d] = %d\n",k,ans[k]);    }    res[len] = '\0';    return res;}

可以看到我对ans的初始化进行了多次尝试,现在已经直接去定义了,ans[1] = 0,但是却报错了,这是报的错误,说是堆缓冲区溢出了:
image.png
假如现在把ans[1] = 0,这行注释掉,会输出:
image.png

通过各种尝试,仍旧初始化不成功。

共有1个答案

吴宝
2024-02-18

我的问题,光顾着改上面ans的空间分配了,忘记改下面res的空间分配了,而且我的代码部分,
for(i = len1 - 1;i >= 0;i--)

    A[i] = num1[i] - '0';

for(i = len2 - 1;i >= 0;i--)

    B[i] = num2[i] - '0';

这里也有问题,应该再定义一个int m = 0,n = 0;改为
for(i = len1 - 1;i >= 0;i--)

    A[m++] = num1[i] - '0';

for(i = len2 - 1;i >= 0;i--)

    B[n++] = num2[i] - '0';

一下为修改后的代码:

char* multiply(char* num1, char* num2) {    int len = 0;    int len1 = 0;    int len2 = 0;    int temp = 0,t = 0;    int i = 0,j = 0,m = 0,n = 0;    len1 = strlen(num1);    len2 = strlen(num2);    char* shortAns = (char*)malloc(sizeof(char) * 2);    shortAns[0] = '0';    shortAns[1] = '\0';    if((len1 == 1 && num1[0] == '0') || (len2 == 1 &&num2[0] == '0'))        return shortAns;    int* A = (int*)malloc(sizeof(int) * len1);    int* B = (int*)malloc(sizeof(int) * len2);    for(i = len1 - 1;i >= 0;i--){        A[m++] = num1[i] - '0';    }    for(i = len2 - 1;i >= 0;i--)        B[n++] = num2[i] - '0';        int* ans = (int*)malloc((len1 + len2 +1)*sizeof(int));    memset(ans,0,sizeof(int) * (len1 + len2 + 1));    //printf("a[1] = %d",ans[1]);    for(i = 0;i < len1;i++){        for(j = 0;j < len2;j++){            ans[i + j] += A[i] * B[j];            printf("A*B = %d,ans[%d] = %d\n",A[i] * B[j],i + j,ans[i + j]);        }    }    for(int i = 0;i < len1 + len2;i++){        temp += ans[i];        ans[i] = temp % 10;        temp /= 10;    }    int k = len1 + len2 - 1;    while(k > 0 && ans[k] == 0){//去掉最高位的0        k--;    }    char* res = (char*)malloc(sizeof(char) * (len1 + len2 + 1));    while(k >= 0){        res[len++] = ans[k--] + '0';    }    res[len] = '\0';    return res;}
 类似资料:
  • 问题内容: 在Java中,以以下方式初始化String数组是完全合法的: 但是,当尝试实例化以String数组作为参数的类时,不允许以下代码: 但这再次起作用: 有人可以解释为什么吗? 问题答案: String[] s = {“FOO”, “BAR”}; 仅在声明时允许 你不能

  • 我在我的android应用程序中使用谷歌地图。我已经创建了密钥并在清单文件中添加了必要的权限。但很快我启动了应用程序,我在调试器中收到了这条消息: Google服务初始化失败,状态:10,缺少用于初始化Google服务的预期资源:“R.string.google_app_id”。可能的原因是缺少google-services.json或com.google.gms.google服务gradle插件

  • 问题内容: 我有一个Android应用程序,我想检查安装的应用程序名称是否与传递给包含此代码的函数的字符串匹配。代码和示例如下: 假设您打过电话,并且手机上的应用程序名称与返回的名称相同。但是,它永远不会。我记录了结果,它应该匹配,但事实并非如此。任何人都可以请问我为什么这行不通吗? 问题答案: 使用String的equals()方法代替==运算符来比较字符串: 在Java中,新手遇到的最常见错误

  • 问题内容: 当数组包含字符串数据时,我在使用numpy时遇到一些琐碎的麻烦。我有以下代码: 现在,当我使用打印时,得到的响应是,显然不是Cat和Apple的预期输出。为什么会这样,如何获得正确的输出? 谢谢! 问题答案: Numpy要求字符串数组具有固定的最大长度。当您使用创建空数组时,默认情况下会将最大长度设置为1。你看你是否做; 它将显示“ | S1”,表示“一个字符的字符串”。随后的数组分配

  • 1. 字符串循环移位包含 2. 字符串循环移位 3. 字符串中单词的翻转 4. 两个字符串包含的字符是否完全相同 5. 计算一组字符集合可以组成的回文字符串的最大长度 6. 字符串同构 7. 回文子字符串个数 8. 判断一个整数是否是回文数 9. 统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数 1. 字符串循环移位包含 编程之美 3.1 // html s1 = AABCD, s2

  • 我在eclipse中配置了spring boot项目,在尝试运行它时遇到了下面的错误。请查看解决方案错误消息: 服务器是tomcat 9。我在网上检查了许多解决方案,但似乎没有解决这个问题。