0

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

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

getnum函数获取一个数字,返回一个指向 char - 的指针char *add函数将两个数字作为字符串处理,returnsresult也是指向 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 个小时里试图解决它,但找不到错误。提前致谢!

4

2 回答 2

2

结尾处有一处严重错别字main()

for (j = i; j == (length - 1); j++) {
/*            ^^ SHOULD BE <= */
    printf("Result is: %s\n", &result[j]);
    break;
}
于 2012-08-28T18:07:59.587 回答
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. 最后一个循环是关于什么的?它甚至不是一个真正的循环——它会执行一次 if iis length - 1,否则根本不执行(大概你在测试输入中遇到了后一种情况)。

例如

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]);
于 2012-08-28T18:21:55.177 回答