2011-10-02 57 views
0

我想建立一个程序,它总结了一个大整数C. 所以我准备好了代码。程序编译通过mingw和Visual C++编译器成功传递。但是我的运行部分有问题。奇怪的是,当我在Visual Studio中调试程序时没有问题,但是当我运行它时,Windows显示程序停止工作。 这是代码:C str功能和malloc

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

我认为这个问题是在某处的指针,但我没有绝对的把握这一点。谁能帮我?

+3

那么是什么问题,你看,当你看到了吗? – johannes

回答

2

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

你应该这样长的malloc:

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

你是对的,但分配的大小必须是最大+ 1 –

+0

@约旦鲍里索夫:它需要是最大+2。你需要+1的空终止符和另一个+1的情况下,结果的长度大于弦的长度。对于我在答案中给出的例子,“10”将需要3个字符的空间,而两个输入字符串的长度均为1,因此它必须是max + 2。 – tinman

1
result[max] = '\0'; 

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