学校编程类问题(Visual Studio)

问题描述 投票:1回答:1

我刚刚开始学习编程,在学校里老师使用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;
}
c windows macos visual-studio-2017 scanf
1个回答
1
投票

如果您想使用所有MS细微差别和非可移植库调用,您可以这样做,但要了解最终它教您使用未使用语言标准记录的函数进行编码。

为此,还要理解C语言有两个主要组成部分:实际语言本身(使它成为C代码的原因),以及标准函数的强制性伴随库(其中一些你很熟悉,printfscanf,等等)。人们可以学习第一部分,语言,并了解它如何独立于附带的标准库。最后,后者(库)为您提供了大量可以使用的操作,如果您严格遵守标准定义的操作,您的代码将更加强大,可移植,并且任何熟悉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调用是否成功。现在你假设用户提供的ab作为输入,它们被正确解析,有效整数。如果不是这种情况,那么您的代码将继续前进,最终使用不确定的数据进行计算,并在流程中调用未定义的行为。 scanf有一个记录在案的返回代码。用它。

© www.soinside.com 2019 - 2024. All rights reserved.