程序添加数字不显示任何输出

时间:2012-08-28 17:34:15

标签: c pointers memory-management

我遇到“添加计算器”的问题。 Valgrind报告没有内存错误,编译器没有错误,但程序没有显示任何输出,尽管printf - “Base is”。

所有指针和变量(我认为)都已正确初始化。

getnum函数获取一个数字,返回一个指向char的指针 - char *add函数将两个数字作为字符串处理,return s result也是指向char(char *)的指针。

我不知道问题是内存分配还是与处理数组相关的程序......

以下是代码:

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

尝试在过去的4小时内完成工作并找不到错误。 提前谢谢!

2 个答案:

答案 0 :(得分:2)

main()的末尾附近有一个严重错字。

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

答案 1 :(得分:1)

查看此代码:

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. 不是计算输出数中的零总数,然后再计算前导零的数量,为什么不将两者合并?
  2. 最后一个循环是什么?它甚至不是一个循环 - 如果ilength - 1,它将执行一次,如果不是则不执行(可能是你在测试输入中遇到后一种情况)。
  3. 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]);