2017-03-01 77 views
0

我有一個循環內的函數,通過檢查每個元素檢查它是否與函數的參數相匹配的增量。C++ |我如何循環如果沒有每次返回一個值的聲明

我的問題是要求返回一個值。由於返回一個值完成了函數,如果一個錯誤的匹配返回false,並且我需要在每個控制路徑上返回一個值,那麼我將無法檢查數組中的任何其他元素以查看它們是否匹配。

我的大部分經驗都在AS3中,其中這個函數結構確實有效。我將如何在C++中正確地構造這個函數?

功能:它的目的是檢查輸入的命令存在,並返回一個布爾值,如果真或假

bool Commands(string _input) 
{ 
    string cmds[] = { "login", "logout", "exit" }; 

    int i = 0; 
    do { 
     if (_input == cmds[i]) 
     { 
      return true; 
     } 
     else 
     { 
      if (i == sizeof(cmds)) 
      { 
       return false; 
      } 
     } 
     i++; 
    } while (i < sizeof(cmds)); 
} 
+2

'的sizeof(CMDS)'沒有做什麼,你認爲它。 – jamesdlin

+2

'返回std :: find(std :: begin(cmds),std :: end(cmds),_input)!= std :: end(cmds);'? – Jarod42

+0

有沒有像這樣的函數返回一個布爾值很多點 - 你的程序幾乎肯定需要類似的代碼來確定*已經輸入了哪些*命令,所以你不妨返回一個'int' - 值'i',並且說'-1'表示無效的命令;那麼你可以在'switch'語句中使用'int'值。多花點功夫,你可以爲每個命令和一個無效的標記創建一個「enum」。也就是說,直接使用'if(input ==「login」)... else if(input ==「logout」)... else // invalid ...;'在調用者中通常是最好的。 –

回答

0

當你循環,返回true當你發現你正在尋找的價值。否則,當循環完成時,您可以簡單地在循環後返回false

bool Commands(string _input) { 
    string cmds[] = { "login", "logout", "exit" }; 

    int i = 0; 
    do { 
     if (_input == cmds[i]) { 
      return true; // we found it! 
     } 
     i++; 
    } while (i < sizeof(cmds)); 
    return false; // we didn't find it. 
} 
+4

你有'我 Jarod42

0

對於初學者,最好將參數聲明爲常量引用。 不需要聲明std::string類型的對象數組。聲明一個字符串文字數組要好得多。

循環錯誤。例如,這表達sizeof(cmds)不會使SENCE在像條件例如此

if (i == sizeof(cmds)) 

數組中元素的數目計算如下

sizeof(cmds)/sizeof(*cmds) 

可使用標準算法大大簡化的功能。

只要寫

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <algorithm> 
#include <iterator> 

bool Commands(const std::string &s) 
{ 
    const char * cmds[] = { "login", "logout", "exit" }; 

    return std::find(std::begin(cmds), std::end(cmds), s) != std::end(cmds); 
} 

int main() 
{ 
    std::cout << std::boolalpha << Commands("logout") << std::endl; 
    std::cout << std::boolalpha << Commands("hello") << std::endl; 

    return 0; 
} 

程序輸出是

true 
false 

如果你想使用的功能的環路,則它可以像它如下所示

#include <iostream> 
#include <iomanip> 
#include <string> 

bool Commands(const std::string &s) 
{ 
    const char * cmds[] = { "login", "logout", "exit" }; 
    const size_t N = sizeof(cmds)/sizeof(*cmds); 

    size_t i = 0; 

    while (i < N && s != cmds[i]) i++; 

    return i != N; 
} 

int main() 
{ 
    std::cout << std::boolalpha << Commands("logout") << std::endl; 
    std::cout << std::boolalpha << Commands("hello") << std::endl; 

    return 0; 
} 

當一個簡單的函數有幾個出口,而且在大多數情況下它不是必需的時,它不是一種好的編程風格ssary。

1

我建議一些改進:

sizeof(cmds)返回該尺寸以字節爲單位的cmds,這將是sizeof(string) * 3,或者例如96在64位的系統上;你的循環將在數組的末尾運行,導致未定義的行爲。一種選擇是使用sizeof(cmds)/sizeof(*cmds)獲得元素的數量,但對你的目的,會更簡單使用std::vector與初始化列表:

std::vector<string> cmds { "login", "logout", "exit" }; 

接下來,您可以用for循環替換你do循環,和sizeof.size()的成員函數std::vector。如果輸入不匹配,則只需不要return並繼續循環的下一次迭代。如果函數在循環後沒有返回,則找不到任何項目,因此您可以使用return false

for (size_t i = 0; i < cmds.size(); ++i) 
    if (_input == cmds[i]) 
    return true; 
return false; 

您也可以從標準<algorithm>頭更換爲std::find算法調用循環:

return std::find(std::begin(cmds), std::end(cmds), _input) != std::end(cmds); 
+0

更喜歡'std :: array'這裏 –

+0

感謝您的提示。我做了你所建議的改變。 – Cription

相關問題