2016-01-14 103 views
0

这里的时候,一个奇怪的错误是代码试图SCANF成全球INT

#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"); 
} 

它刹车后,我输入的东西我scanf()(试图改变全球int)通过控制台(INT数量例如)并丢弃我为“未处理的异常”

enter image description here

为什么会这样呢?我使用MS Visual Studio 2005中

+0

#offtopic:你是如何 “奇怪” 的区分和“不奇怪”的错误? –

+1

@EugeneSh。 “奇怪” - >运行时失败。 “非奇怪” - >编译错误。只是我的两分钱。 :) –

+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(),它应该是:

    int main() 
    

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

我一直认为你所称的*“原型”*被称为函数的*“签名”* - - 这是不正确的? – cat

+0

另外,我认为'main'的类型是由C++编译器插入的,所以它根本就不需要(但仍然不是'void')? – cat

+1

@cat:*原型*是C术语,我重新解释了答案。 – chqrlie

4

在代码

scanf("%i", souls); 

应该是

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

scanf()需要一个指向类型作为存储对应于所提供的格式的扫描值参数符。

也就是说,if (situation=="souls")也是错的。您无法使用==运算符来比较字符串的内容。您需要使用strcmp()

+0

*原因*背后是因为'scanf''需要一个指向var的指针,所以它可以修改它。 OP可能不知道这一点;也许你应该在你的回答中解释一下? – cat

+1

@cat我不知道我已经这么做了吗? (不那么忍者编辑);) –

+0

@SouravGhosh我改变了功能 无效userInput(INT情况){ 如果(局势== 1).... 并添加&符号 - 它仍然下降了我与出现完全相同的错误 –