2016-01-14 48 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).... 並添加&符號 - 它仍然下降了我與出現完全相同的錯誤 –