尝试将scanf转换为全局int时出现奇怪错误

时间:2016-01-14 20:42:25

标签: c++ visual-studio visual-c++ scanf

这是代码

#include "stdafx.h"
#include <string>
#include <clocale>
#include <stdio.h>
#include <cstdlib>  

using namespace std;

int souls;

void userInput(char situation[20]) {
    if (situation == "souls") {
        scanf("%i", souls);
        printf("%i", souls);
    }
}

void main() {
    setlocale(LC_CTYPE, "rus");

    userInput("souls");

    system("pause");
}

在我通过控制台(例如int号)输入scanf()(试图更改全局int)中的某些内容后,它会进行制动,并将我置于“未处理的异常”中

enter image description here

为什么会这样?我正在使用MS Visual Studio 2005。

2 个答案:

答案 0 :(得分:4)

在您的代码中

scanf("%i", souls);

应该是

scanf("%i", &souls);
            ^

scanf()需要一个指向type的指针作为参数来存储与提供的格式说明符对应的扫描值。

尽管如此,if (situation=="souls")也是错误的。您无法使用==运算符比较字符串的内容。您需要使用strcmp()

答案 1 :(得分:1)

您的代码有几个问题:

  • 您不能以这种方式比较C字符串:if (situation == "souls"):您正在比较char数组的地址,而不是它们的内容。您需要使用strcmp(并包括<cstring>):

    if (!strcmp(situation, "souls"))
    
  • 签名void userInput(char situation[20])令人困惑:大小20信息被忽略,而您实际上正在传递较短字符串文字的地址,此签名更合适:

    void userInput(const char *situation)
    
  • 您需要将输出变量的地址传递给scanf并检查返回值:scanf("%i", souls);调用未定义的行为,应将其更改为:

    if (scanf("%i", &souls) == 1) {
        /* souls was assigned a value */
    } else {
        /* scanf failed to parse an integer */
    }
    
  • main的签名不应为void main(),而应为:{/ p>

    int main()
    

    int main(int argc, char *argv[])