Peter Cerba
Peter Cerba

Reputation: 816

program adding numbers doesn't show any output

I have a problem with an "add calculator". Valgrind reports no memory errors, no errors from compiler but the program doesn't show any output despite the printf - "Base is ".

All pointers, and variables are (n my opinion) correctly initialized.

getnum function gets a number, returns a pointer to char - char *, add function processes two numbers as strings, returns result which is a pointer to char (char *) as well.

I don't know whether the problem is memory allocation or procedures connected to processing arrays...

Here's the code:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#define MAX(A,B) ((A)>(B) ? (A) : (B))

char *getnum(FILE *infile, int base)
{
    int len = 10;
    int c;
    int pos = 0;
    char *num = NULL;
    char *tmpnum = NULL;

    num = malloc(sizeof(char)*len);

    while (((c = fgetc(infile)) != EOF) && (isalnum(c))) {

        if (isdigit(c)) {
           /* irrelevant*/
        }
        else if (isalpha(c)) {
            fprintf(stderr, "Wrong base, expected 16\n");
            free(num);
            return NULL;

        }
        if (pos >= len) {
            /*realloc*/
        }
    }

    return num;           
}

int main(int argc, char **argv)
{
    FILE *infile = NULL;
    char *number1 = NULL;
    char *number2 = NULL;
    char *result = NULL;
    int base, i, j = 0, length, count = 0;


    infile = fopen(argv[1], "r");

    base  = atoi(argv[2]);
    while (!feof(infile)) {
        number1 = getnum(infile, base);

        number2 = getnum(infile, base);

        break;
    }
    printf("Base is %d\n", base);
    result = add(number1, number2, base);

    length = strlen(result);
    for (i = 0; i <= length - 1; i++) {
        if (result[i] == '0') {
            count++;
        }
    }

    for (j = i; j == (length - 1); j++) {
        printf("Result is: %s\n", &result[j]);
        break;
    }
    free(result);
    result = NULL;
    fclose(infile);
    return 0;
}

Trying to work it out for the past 4 hours and can't find a mistake. Thanks in advance!

Upvotes: 0

Views: 202

Answers (2)

Matthew Slattery
Matthew Slattery

Reputation: 46998

Looking at this code:

for (i = 0; i <= length - 1; i++) {
    if (result[i] == '0') {
        count++;
    }
}
if (count == length) {
    printf("Result is 0\n");
    free(result);
    result = NULL;                     /* arguable */
    fclose(infile);
    return 0;
}
for (i = 0; i <= length - 1; i++) {
    if (result[i] != '0') {
        break;
    }
}
for (j = i; j == (length - 1); j++) {
    printf("Result is: %s\n", &result[j]);
    break;
}
  1. Instead of counting the total number of zeroes in the output number, and then counting the number of leading zeroes again, why not combine the two?
  2. What is the last loop about? It's not even really a loop - it will execute once if i is length - 1, or not at all if not (presumably you're hitting the latter case in your test input).

e.g.

for (count = 0; count < length; count++) {
    if (result[count] != '0')
        break;
}
if (count == length) {
    printf("Result is 0\n");
    free(result);
    result = NULL;                     /* arguable */
    fclose(infile);
    return 0;
}
printf("Result is: %s\n", &result[count]);

Upvotes: 1

timrau
timrau

Reputation: 23058

There is one severe typo near the end of main().

for (j = i; j == (length - 1); j++) {
/*            ^^ SHOULD BE <= */
    printf("Result is: %s\n", &result[j]);
    break;
}

Upvotes: 2

Related Questions