我刚刚开始学习编程,在学校里老师使用Macbook和一个名为“X-Code”的程序,在家里我用Visual Studio(2017)编写了Windows。教导给出了关于“setbuf”是什么的0解释,并且还说我们必须在Visual Studio中使用scanf略有不同。现在我在家里,完全无助。实际上VS说最好尝试scanf_s,所以我做了,程序运行直到我输入“Operation”。输入前两个参数后,它会停止,窗口会自行关闭。你们任何人都可以帮助我,并对我不理解的事情给我一些解释吗?
提前致谢。这是我写的代码
void main() {
int a, b, c;
char m;
printf("Erstes Argument: ");
scanf_s("%d", &a);
printf("Zweites Argument: ");
scanf_s("%d", &b);
printf("Operation: "),
//setvbuf(stdin,NULL);
scanf_s("%c", &m);
if (m == '*') {
c = a * b;
printf("%d * %d = %d \n", a, b, c);
}
else {
printf("Falsche Operation! \n");
}
return 0;
}
如果您想使用所有MS细微差别和非可移植库调用,您可以这样做,但要了解最终它教您使用未使用语言标准记录的函数进行编码。
为此,还要理解C语言有两个主要组成部分:实际语言本身(使它成为C代码的原因),以及标准函数的强制性伴随库(其中一些你很熟悉,printf
,scanf
,等等)。人们可以学习第一部分,语言,并了解它如何独立于附带的标准库。最后,后者(库)为您提供了大量可以使用的操作,如果您严格遵守标准定义的操作,您的代码将更加强大,可移植,并且任何熟悉C的工程师都能理解说-相同。
无论如何,使用库扩展使您的程序“正常工作”的最小变化微软选择强制执行其实现的用户:
#include <stdio.h>
// FIXED return type
int main() {
int a, b, c;
char m;
printf("Erstes Argument: ");
scanf_s("%d", &a);
printf("Zweites Argument: ");
scanf_s("%d", &b);
printf("Operation: ");
// FIXED arguments passed to setvbuf
setvbuf(stdin, NULL, _IONBF, 0);
// FIXED arguments passed to scanf_s
// FIXED added white space consumption prior to character read
scanf_s(" %c", &m, 1);
if (m == '*')
{
c = a * b;
printf("%d * %d = %d \n", a, b, c);
}
else
{
printf("Falsche Operation! \n");
}
return 0;
}
一个不依赖于MS-isms的正确,标准兼容版本可能是:
#include <stdio.h>
int main() {
int a, b, c;
char m;
printf("Erstes Argument: ");
scanf("%d", &a);
printf("Zweites Argument: ");
scanf("%d", &b);
printf("Operation: ");
scanf(" %c", &m);
if (m == '*')
{
c = a * b;
printf("%d * %d = %d \n", a, b, c);
}
else
{
printf("Falsche Operation! \n");
}
return 0;
}
没有功能禁用宏_CRT_SECURE_NO_WARNINGS
,你会受到来自MS的过多三个警告,说明你应该使用他们的“更安全”的功能。虽然他们勇敢地尝试使我们的程序更安全,但是如果工程师只是学会了如何正确编写更安全的代码,那么人们可以轻易地争论如何更好。
最后,你的代码没有完成。您应该检查您的IO调用是否成功。现在你假设用户提供的a
和b
作为输入,它们被正确解析,有效整数。如果不是这种情况,那么您的代码将继续前进,最终使用不确定的数据进行计算,并在流程中调用未定义的行为。 scanf
有一个记录在案的返回代码。用它。