我正在尝试为一个类构建一个简单的计算器但由于某种原因程序不断崩溃。
我环顾四周,没有看到任何可以告诉我什么是错的,所以我想我会在这里问。
现在的诀窍是我们只学习了if/else
语句,这是我们可以使用的唯一函数。
#include <stdio.h>
void main() {
float num1, num2;
int type;
char oper;
printf_s("Please enter your choise:\n1. Decimal calculator.\n2. Binary calculator.\n");
scanf_s("%d", &type);
if (type == 1) {
printf_s("Please enter the equation you want to solve and then press Enter:\n");
scanf_s("%f %c %f",&num1,&oper,&num2);
}
}
任何人都知道这里有什么问题吗?每次我输入1 + 1
,例如程序崩溃。
谢谢!
答案 0 :(得分:0)
您的问题是scanf_s需要buffer size specifier after every %c %s and %[。有关类似问题,请参阅this post。实际上,scanf没有这个问题,你实际做的是将num2的地址值作为%c
的缓冲区大小说明符:
scanf_s("%f %c %f",&num1,&oper,&num2);
请注意,即使是printf_s has additional requirements
在使用scanf_s的同时修复此问题:
#include <stdio.h>
int main() {
float num1, num2;
int type;
char oper;
const int oper_buff_size = 1;
printf_s("Please enter your choise:\n1. Decimal calculator.\n2. Binary calculator.\n");
scanf_s("%d", &type);
if (type == 1) {
printf_s("Please enter the equation you want to solve and then press Enter:\n");
// note oper_buff_size, the buffer size of the char pointer
scanf_s("%f %c %f", &num1, &oper, oper_buff_size, &num2);
// test to show this works
printf_s("Entered: %f %c %f", num1, oper, num2);
}
return 0;
}
您可能会问为什么我们需要指定%c
格式的长度,因为它应该只是字节大小的char。我相信这是因为您需要将字符的指针放入格式中,因此您不知道您指向的是char *数组还是指向char的指针(如在这种情况下)
我还会添加一个附录,虽然这不是您的程序失败的原因,但是避免使用跨平台不兼容的怪癖,例如void main,因为这会让人们更难找到代码中的真正问题。请勿使用void main()
,请使用int main(...) and return 0; instead。 Void main在标准C或C ++中无效,它是Microsoft Visual Studio实现该语言的一个怪癖。