Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C-str函数与malloc_C_String_Malloc - Fatal编程技术网

C-str函数与malloc

C-str函数与malloc,c,string,malloc,C,String,Malloc,我想建立一个程序,用C语言求一个大整数的和。 我已经准备好了密码。该程序通过MIW和Visual C++编译器成功编译。但我对跑步部分有问题。奇怪的是,当我在VisualStudio中调试程序时没有问题,但当我运行它时,我的Windows显示程序停止工作。 代码如下: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <c

我想建立一个程序,用C语言求一个大整数的和。 我已经准备好了密码。该程序通过MIW和Visual C++编译器成功编译。但我对跑步部分有问题。奇怪的是,当我在VisualStudio中调试程序时没有问题,但当我运行它时,我的Windows显示程序停止工作。 代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include "sum.h"

int isNumber(char* number)
{
    int lenght = strlen(number);
    int i,result = 0;
    for (i = 0 ; i < lenght ; i++)
    {
        if (isdigit(*number++))
        {
            result = 1;
        }
        else
        {
            result = 0;
            break;
        }
    }
    return result;
}
int cti(char ch)
{
    return ch - '0';
}
char* addZeros(char* number,int lenght)
{
    int num_lenght = strlen(number),size = abs(lenght - num_lenght),i;
    char* zeros = (char*)malloc(size);

    strcpy(zeros,"");
    zeros[size - 1] = '\0';
    for (i = 0 ; i < abs(lenght - num_lenght) ; i++)
    {
        strcpy(&zeros[i],"0");
    }
    strncat(zeros,number,size);
    number = (char*)malloc(sizeof(char)*size);
    strncpy(number,zeros,size);
    return number;
}
char* sum(char* numberOne,char* numberTwo)
{
    if (numberOne == NULL || numberTwo == NULL)
        return NULL;
    if (!isNumber(numberOne) || !isNumber(numberTwo))
        return NULL;

    int CF = 0;
    int lenghtOne = strlen(numberOne),lenghtTwo = strlen(numberTwo);
    if (lenghtOne == 0 || lenghtTwo == 0)
        return lenghtOne == 0 ? numberTwo : numberOne;
    int max = lenghtOne > lenghtTwo? lenghtOne : lenghtTwo,index;
    char* result = (char*)malloc(max);
    int res = 0;
    result[max] = '\0';
    if (lenghtOne > lenghtTwo) numberTwo=addZeros(numberTwo,strlen(numberOne));
    else if (lenghtOne < lenghtTwo) numberOne = addZeros(numberOne,strlen(numberTwo));
    for ( index = max - 1 ; index >=0 ; index--)
    {
        res = cti(numberOne[index]) + cti(numberTwo[index]);
        if (((res%10) + CF) > 9) 
        {
            int num = ((res%10) + CF);

            result[index] = (char)((int)'0'+num%10);
            CF = num / 10;
        }
        else
        {
            result[index] = (char)((int)'0'+((res%10) + CF));
            CF = res / 10;
        }
    }
    return result;
}
int main(int argc, char *argv[])
{
    char* num = "12345678";
    char* num2= "2341";
    char* result = sum(num,num2);
    printf("%s\n",result);
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括“sum.h”
int isNumber(字符*数字)
{
整数长度=strlen(数字);
int i,结果=0;
对于(i=0;ilenghtwo?lenghtOne:lenghtwo,索引;
字符*结果=(字符*)malloc(最大值);
int res=0;
结果[max]='\0';
如果(lenghtOne>lenghtwo)numberTwo=addZeros(numberTwo,strlen(numberOne));
否则如果(lenghtOne=0;索引--)
{
res=cti(numberOne[index])+cti(numberTwo[index]);
如果((res%10)+CF>9)
{
int num=((res%10)+CF);
结果[索引]=(字符)((int)“0”+num%10);
CF=num/10;
}
其他的
{
结果[索引]=(字符)((int)'0'+((res%10)+CF));
CF=res/10;
}
}
返回结果;
}
int main(int argc,char*argv[])
{
char*num=“12345678”;
char*num2=“2341”;
char*result=sum(num,num2);
printf(“%s\n”,结果);
返回0;
}
我认为问题出在指针的某个地方,但我不能完全肯定这一点。有人能帮我吗

result[max] = '\0';
这是不正确的,因为您只为结果分配了最大字符数。我没有详细研究逻辑,但分配最多+1个字符可以解决这个特殊问题


这是不正确的,因为您只为结果分配了最大字符数。我没有详细研究逻辑,但分配最多+1个字符可以解决这个问题。

您分配的内存量不够。它不包括用于终止字符串的空字符的空间,也不考虑“9”+“1”等和的结果长度的变化。然后在数组结束后写入空终止字符

您应该使用如下长度进行malloc:

char* result = (char*)malloc(max + 2);

您正在分配的内存量不足。它不包括用于终止字符串的空字符的空间,也不考虑“9”+“1”等和的结果长度的变化。然后在数组结束后写入空终止字符

您应该使用如下长度进行malloc:

char* result = (char*)malloc(max + 2);

那么,当你看到它的时候,你看到了什么问题?那么当你看到它的时候,你看到了什么问题?@Jordan Borisov:它需要是max+2。空终止符需要+1,结果长度大于字符串长度的情况需要+1。对于我在回答中给出的示例,“10”将需要3个字符的空间,而两个输入字符串的长度均为1。因此它必须是最大+2。@Jordan Borisov:它必须是最大+2。空终止符需要+1,结果长度大于字符串长度的情况需要+1。对于我在回答中给出的示例,“10”将需要3个字符的空间,而两个输入字符串的长度均为1。因此,它必须是max+2。