c - 简单的计算器不适用于 C 中的大数字
问题描述
我正在尝试构建一个简单的计算器来执行乘法和加法。
我有这个代码
#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
问题是当数字越来越大时,它们会变成负数。这是变量内存分配的问题吗?如何解决这个问题?
解决方案
你溢出了变量。
您在这里有两个选择。要么为任意大的数字找到一个解决方案(你可以使用一些库),要么接受你不能使用太大的数字。
有符号 64 位整数可以容纳的最大数字(从您long
的系统上的 64 位输出中可以明显看出)是 9223372036854775807,无符号 64 位整数的最大数字是 18446744073709551615。
值得一提的是,溢出仅对无符号类型具有定义的行为。
其他的建议
char[4]
不足以容纳“加号”,因为您需要放置'\0'
. 改为使用char[5]
。
没有理由在此代码中使用指针。除非您有充分的理由,否则我建议您更改为:
long plus(long current, long num) {
return current + num;
}
这反过来意味着您可以完全跳过该功能。你不需要一个函数来执行两个整数的加法,因为你有+
运算符来做这件事。
此外,您的使用scanf
是不安全的。您可以写超出数组的末尾。改为这样做:scanf("%4s %li"
注意 4。它给出了字符串的最大长度。最重要的是,您不应该scanf
检查EOF
. 阅读有关它实际返回的内容的文档。
推荐阅读
- social-networking - StrapiJs- 用户身份验证和用户配置文件
- docker - Docker 组合使用 dockerfile 以外的名称
- c# - 将表示 UCHAR 数组的 json 字符串响应转换为 Byte 数组
- visual-studio - 键入时 Visual Studio 2019 devenv CPU 峰值
- java - 使用 Java 在 SFTP 中创建目录
- python - 如何在一个脚本中从两个网站抓取网页?
- c# - TCP Client C#:根据验证程序,远程证书无效
- ubuntu - npm 不起作用,总是抛出“找不到模块 semver”
- django - 如何将绑定的 Django 模型表单呈现为 HTML 安全的?
- python - 如果点在前,我如何跳过字符串中的点?