访问冲突错误 C

6
我是一名初学者,正在学习C和C++。我正在尝试在Visual Studio 2012 Express for Windows Desktop上运行这段代码。这是我自己编写的一个简单的计算器代码!但是每当我运行它时,我会收到这个错误消息:Unhandled exception at 0x519600B4 (msvcr110d.dll) in Calculator.exe: 0xC0000005: Access violation writing location 0x00000000. 请谅解我的错误(这是我第一次),谢谢!
#include<stdio.h>
#include<conio.h>

main ()
{
    int num1, num2, result;
    char oper;
    scanf_s("%d%c%d", &num1, &oper, &num2);
    switch(oper)
    {
    case '+':
        result = num1 + num2;
        printf("%d", result);
        break;
    case '-':
        result = num1 - num2;
        printf("%d", result);
        break;
    case '*':
        result = num1 * num2;
        printf("%d", result);
        break;
    case '/':
        result = num1 / num2;
        printf("%d", result);
        break;
    default:
        printf("ERROR: INVALID OR UNRECOGNISED INPUT\n");
        break;
    }
    _getch();
}

11
通常情况下,你不必为编码错误道歉,因为你是初学者,这些错误并不会触犯人们的感情。 :) - unwind
2
你可以使用调试器逐步执行代码,查看错误出现的时间。 - Vorac
3
这段代码不应该在Windows的标准C编译器上编译。对于像这样托管程序的正确格式是int main(void)。如果你是初学者,应该考虑使用符合C标准的编译器,否则会养成很多不良习惯。 - Lundin
1个回答

15

使用scanf_s时,对于%c格式字符串,您必须指定要读取的字符数:

scanf_s("%d%c%d", &num1, &oper, 1, &num2);

文档中描述了要求:

与scanf和wscanf不同,scanf_s和wscanf_s要求对所有输入参数(类型为c、C、s、S或[]括起来的字符串控制集)指定缓冲区大小。字符缓冲区大小作为附加参数紧随缓冲区或变量的指针之后传递。


谢谢您,那么在这种情况下应该是这样的吗?“char oper[1];” - Chinmay Dabke
不,你代码中变量的声明 (char oper;) 是正确的。你只需要在 scanf_s 调用中添加字符计数参数即可。 - David Heffernan
不需要。它仍然是一个单个字符变量。你只需要在scanf_s中指定大小即可。创建长度为1的数组没有意义。 - fkl
请问您能告诉我更改的语法吗? - Chinmay Dabke
1
我已经完成了。你只需要将调用 scanf_s 的代码行替换为我的答案中的单行代码即可。 - David Heffernan
我在回答中没有提到的是,尽管我注意到了,但你的主要声明是非标准的。对于这个程序,你应该使用 int main(void) - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接