这是代码
#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
)中的某些内容后,它会进行制动,并将我置于“未处理的异常”中
为什么会这样?我正在使用MS Visual Studio 2005。
答案 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[])