I am receiving a Segmentation Fault on line 11. There might be something wrong with the way i am compiling it because this is the first time that i have used terminal. At any rate, the segfault is in line 11 and i have never had this problem before. Let me know what you think.
Code:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct integer
{
int *digits;
int size;
};
void print(struct integer *p)
{
int i;
for (i = p->size - 1; i >= 0; i--)
printf("%d", p->digits[i]);
}
struct integer *convert_integer(char *stringInt)
{
int i;
struct integer *p = malloc(sizeof(struct integer));
p->size = strlen(stringInt);
p->digits = malloc(sizeof(int) * p->size);
for (i = 0; i < p->size; i++)
p->digits[i] = stringInt[p->size - 1 - i] - '0';
return p;
}
int isZero(struct integer *p)
{
return (p->size == 1 && p->digits[0] == 0);
}
struct integer *multiply(struct integer *p, struct integer *q)
{
int i, j, carry;
struct integer *m;
// Terminate early in special case of multiplication by zero
if (isZero(p) || isZero(q))
return convert_integer("0");
// Create struct to hold product
m = malloc(sizeof(struct integer));
m->size = p->size + q->size;
m->digits = calloc(m->size, sizeof(int));
// Perform multiplication; don't worry about addition overflows yet
for (i = 0; i < q->size; i++)
for (j = 0; j < p->size; j++)
m->digits[i + j] += q->digits[i] * p->digits[j];
// Compensate for addition overflows
for (i = carry = 0; i < m->size; i++)
{
m->digits[i] += carry;
carry = m->digits[i] / 10;
m->digits[i] = m->digits[i] % 10;
}
// Strip leading zero if it exists
if (m->digits[m->size - 1] == 0)
m->size--;
return m;
}
struct integer *destroy_integer(struct integer *p)
{
free(p->digits);
free(p);
return NULL;
}
int main(void)
{
int N, i;
char buffer[10001];
struct integer *p, *q, *m;
FILE *ifp = fopen("bigint.rft", "r");
fscanf(ifp, "%d", &N);
for (i = 1; i <= N; i++)
{
fscanf(ifp, "%s", buffer);
p = convert_integer(buffer);
fscanf(ifp, "%s", buffer);
q = convert_integer(buffer);
m = multiply(p, q);
// Problem Output
printf("Problem #%d: ", i);
print(p);
printf(" * ");
print(q);
printf(" = ");
print(m);
printf("\n");
// Memory Management
p = destroy_integer(p);
q = destroy_integer(q);
m = destroy_integer(m);
}
fclose(ifp);
return 0;
}