【发布时间】:2018-11-25 15:05:28
【问题描述】:
我正在尝试构建一个简单的计算器来执行乘法和加法。
我有这个代码
#include <stdio.h>
#include <string.h>
long result = 0;
long *resultPointer = &result;
long plus(long *current, long num) {
return (*current + num);
}
long krat(long *current, long num) {
return (*current * num);
}
int main() {
char operator[4];
long num;
printf("%d\n", 0);
while(scanf("%s %li", &operator[0], &num) != EOF){
if (num > 0) {
if (strcmp(operator, "krat") == 0) {
*resultPointer = krat(&result, num);
}
if (strcmp(operator, "plus") == 0) {
*resultPointer = plus(&result, num);
}
printf("%li\n", result);
}
}
return 0;
}
这是程序的输入
plus 123456789
krat 123456789
plus 0
krat 2
krat 3
krat 4
krat 5
krat 6
这是输出
0
123456789
15241578750190521
30483157500381042
91449472501143126
365797890004572504
1828989450022862520
-7472807373572376496
问题是当数字越来越大时,它们会变成负数。这是变量内存分配的问题吗?如何解决?
【问题讨论】:
-
您应该删除大约 90% 的输入和输出。不需要了解您的问题。
-
与您的数字无关,但很可能是未定义的行为:
char operator[4];对于"krat"和"plus"来说太小了,它们是 4 个字符 + 1 用于终止 0 长.所以operator应该是char operator[5];,你应该限制scanf()用"%4s"读取4个字符。 -
你为什么不简单地使用
result = operator(result, num)? -
您使用过
long。为什么?short或int不够吗?在您看来,为什么 C 有这些不同的类型? -
如果您的编译器支持它,您可以使用
<stdint.h>并将long替换为int64_t。