简体   繁体   English

Microsoft Visual Studio 2013 C程序异常

[英]Microsoft Visual Studio 2013 C Program Exception

I am using Microsoft Visual Stusio 2013 Community Edition Update 4 to write a program in the C programming language (not C++). 我正在使用Microsoft Visual Stusio 2013 Community Edition Update 4以C编程语言(不是C ++)编写程序。 Whenever I try to build and run my program, partway through execution it tells me "Unhandled exception at 0x52873FD4 (msvcr120d.dll) in program.exe: 0xC0000005: Access violation writing location 0x00C40000." 每当我尝试构建和运行程序时,执行过程中都会告诉我“ program.exe中0x52873FD4(msvcr120d.dll)的未处理异常:0xC0000005:访问冲突写入位置0x00C40000。” When I copy and paste the contents of the .c file into another IDE (code blocks) it compiles and runs without a problem. 当我将.c文件的内容复制并粘贴到另一个IDE(代码块)中时,它可以编译并运行而不会出现问题。 (Although I do have to change all the scanf_s statements in the code to scanf ) (尽管我必须将代码中的所有scanf_s语句更改为scanf

The source code from within the .c file of my program 来自我程序的.c文件中的源代码

#include <math.h>
#include <stdio.h>
#include <string.h>

#define PI 3.14159265358979323846;

double add();
double cos_d_r();
double div();
double mult();
void list();

int main()
{
    //Declaration of variables
    char oper[20];
    double ans;
    int loop = NULL;

    //While loop allows for multiple executions without restarting program
    while (!loop)
    {
        printf("\n\nEnter a mathematical operation.\n\nFor a list of options, enter 'list'\n\n");
        scanf_s(" %s", oper);

        //If statement to determine which operation to do

        //Addition
        if (strcmp(oper, "add") == 0 || strcmp(oper, "addition") == 0 || oper[0] == '+')
        {
            ans = add();
            printf("The sum is %.2f\n", ans);
        }

        //Cosine
        else if (strcmp(oper, "cos") == 0 || strcmp(oper, "cosine") == 0)
        {
            ans = cos_d_r();
            printf("The cosine of the angle is %lf\n", ans);
        }

        //Division
        else if (strcmp(oper, "divide") == 0 || strcmp(oper, "division") == 0 || oper[0] == '/')
        {
            ans = div();
            printf("The quotient is %.2f\n", ans);
        }

        //List of possible operations
        else if (strcmp(oper, "list") == 0)
        {
            list();
        }

        //Multiplication
        else if (strcmp(oper, "multiply") == 0 || strcmp(oper, "multiplication" == 0) || oper[0] == '*')
        {
            ans = mult();
            printf("The product is %.2f", ans);
        }
    }

    return 0;
}

//Declaration of functions

//Addition
double add()
{
    double ans;
    double num_1;
    double num_2;

    puts("Enter the first number");
    scanf_s(" %lf", &num_1);
    puts("Enter the second number");
    scanf_s(" %lf", &num_2);
    ans = num_1 + num_2;
    return ans;
}

//Cosine
/*Uses cos() function from math.h
this function adds option for degrees or radians*/
double cos_d_r()
{
    char deg_rad;
    double angle;
    double ans;
    int loop = NULL;

    while (!loop)
    {
        puts("Degrees or radians? Enter 'd' or 'r'");
        scanf_s(" %c", &deg_rad);

        //Degrees
        if (deg_rad == 'd')
        {
            puts("Enter an angle in degrees");
            scanf_s(" %lf", &angle);
            angle = angle / 180 * PI;
            ans = cos(angle);
            loop = 1;
            return ans;
        }

        //Radians
        else if (deg_rad == 'r')
        {
            puts("Enter an angle in radians");
            scanf_s(" %lf", &angle);
            ans = cos(angle);
            loop = 1;
            return ans;
        }

        //Else statement repeats loop if user enters text other than 'd' or 'r'
        else
        {
            puts("ERROR. Enter either 'd' or 'r'");

        }
    }
}

//Division
double div()
{
    double ans;
    double num_1;
    double num_2;

    puts("Enter the dividend");
    scanf_s(" %lf", &num_1);
    puts("Enter the divisor");
    scanf_s(" %lf", &num_2);
    ans = num_1 / num_2;
    return ans;
}

//Multiplication
double mult()
{
    double ans;
    double num_1;
    double num_2;

    puts("Enter the first number");
    scanf_s(" %lf", &num_1);
    puts("Enter the second number");
    scanf_s(" %lf", &num_2);
    ans = num_1 * num_2;
    return ans;
}

//List of possible operations
void list()
{
    printf("The possible operations are:\n\n");
    printf("Operation\tDescription\tCommand");
    printf("Addition\tAdds two numbers together\tAdd, Addition, +\n");
    printf("Cosine\tFinds the cosine of the angle entered\tCos, Cosine");
    printf("Division\tDivides the first number by the second\tDivide, Division, /");
    printf("Multiplication\tMultiplies the two numbers\tMultiply, Multiplication, *");
}

You should read description of functions you use first! 您应该阅读首先使用的功能说明! Take a look at scanf_s function description at MSDN. 看一下MSDN上的scanf_s函数描述。 You programm crashes at first call of this function 您在第一次调用此函数时崩溃

scanf_s(" %s", oper);

The correct way to use it: 正确的使用方式:

scanf_s("%s", oper, _countof(oper)); // or sizeof(oper), but only with char array

Also you should correct other calls of scanf_s in your code. 另外,您应该在代码中更正scanf_s其他调用。 (Or disable errors for scanf call with #define _CRT_SECURE_NO_WARNINGS before #include <stdio.h> ) (或在#include <stdio.h>之前使用#define _CRT_SECURE_NO_WARNINGS禁用scanf调用的错误)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM