【发布时间】:2015-11-15 16:17:37
【问题描述】:
我正在尝试编写一个程序,该程序将汇总非常大的数字。不幸的是,我被卡住了——即使我注释掉 malloc 和 realloc (编译器似乎失败了),它也不会返回任何结果。有任何想法吗?我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int i,j,x;
char *actual = NULL;
char *sum = NULL;
void init () {
sum = malloc(500);
actual = malloc(500);
}
void calculate (char *argv[]) {
int rest = 0;
actual = *argv;
actual = realloc(actual, strlen(*argv));
if (strlen(actual) > strlen(sum)) {
sum = realloc(sum, strlen(actual) + 1);
} else sum = realloc(sum, strlen(sum) + 1);
long b;
for (b = 1; b < strlen(actual); b++) {
rest = rest + atoi(&sum[strlen(sum) - b]) + atoi(&actual[strlen(actual) - b]);
if (rest > 9) {
sum[strlen(sum) - b] = rest - 10;
rest = 1; // carrying over 1
} else {
sum[strlen(sum) - b] = rest;
rest = 0;
}
}
}
void writeResult () {
printf("VYPIS - sum:");
printf("strlen souctu je: %lu\n",strlen(sum));
long c;
for (c = 0; c <= strlen(sum); c++) {
printf("%c",sum[c]);
}
printf("\n");
}
void emtpy () {
free(actual);
free(sum);
}
int main(int argc, char * argv[]) {
init();
for (i = 1; i < argc; i++) {
calculate(&argv[i]);
}
writeResult();
emtpy();
return 0;
}
【问题讨论】:
-
始终检查可能遇到错误的函数的结果!
-
遍历每个对 strlen() 的调用,并确保传递了一个有效的以 NULL 结尾的字符串。
-
附带说明:
atoi需要一个以 null 结尾的字符串,但不是:atoi(&sum[strlen(sum) - b])。要转换单个数字,您只需执行x - '0'。 -
'实际 = *argv;'覆盖在 Init() 中分配的指针。
-
你的bug太多了。修复已经注意到的那些,将所有那些 strlen() 调用读入中间临时变量,调试重建并使用你的调试器。