2013-05-02 171 views
0

我有一段代碼已正確由Dev C++編寫。當我試圖用VS2012 express執行它時,我遇到了這個警告''警告C4996:'':這個函數或變量可能是不安全的。考慮使用strtok_s代替。要禁用棄用,請使用_CRT_SECURE_NO_WARNINGS。詳情請參閱聯機幫助''strtok_s安全調試警告解決

我試圖禁用安全警告,但是我發現_CRT_SECURE_NO_WARNINGS選項在我的VS express中不可用。所以我不得不修改我的代碼以使用strtok_s而不是strtok來避免此警告。但是,即使代碼執行到最後也沒有任何錯誤,但出現結果不出現的問題。顯然沒有閱讀文件發生。這是以前的代碼上開發的C++

const char* token[MAX_TOKENS_PER_LINE] = {}; // initialize to 0 
    // parse the line 
    token[0] = strtok(buf, DELIMITER); // first token 
    if (token[0]) // zero if line is blank 
    { 
     for (n = 1; n < MAX_TOKENS_PER_LINE; n++) 
     { 
    token[n] = strtok(0, DELIMITER); // subsequent tokens 
     if (!token[n]) break; // no more tokens 

運作良好,這就是我試圖執行使用VS2012表達

const char* token[MAX_TOKENS_PER_LINE] = {}; // initialize to 0 
    char* next_token[MAX_TOKENS_PER_LINE] = {}; // initialize to 0 
    //char* next_token; 
    // parse the line 
    token[0] = strtok_s(buf, DELIMITER, &next_token[0]); // first token 
    if (token[0]) // zero if line is blank 
    { 
     for (n = 1; n < MAX_TOKENS_PER_LINE; n++) 
     { 
    token[n] = strtok_s(0, DELIMITER, &next_token[n]); // subsequent tokens 
     if (!token[n]) break; // no more tokens 

什麼是錯的第二個代碼?

+1

'_CRT_SECURE_NO_WARNINGS'肯定可用。你只需要知道它是一個宏,你必須在包含第一個Microsoft頭之前定義它。任何Visual Studio版本都沒有好的複選框。 – MSalters 2013-05-02 11:15:02

回答

1

這是因爲對strtok_s的下一次連續調用期望context指針(strtok_s的最後一個參數)由上次調用填充。

每次調用都使用不同的(未初始化的)指針,這意味着上下文丟失,或者說它使用看似隨機的指針作爲上下文。

您應該使用未註釋的變量next_token而不是數組。

+0

我沒有使用outcommented變量next_token,它工作正常。我發現的另一個選擇是將SDL檢查設置爲關閉。謝謝 – Hawk 2013-05-05 05:04:52