2015-12-21 105 views
-2

我想檢查一個字符串數組中的每個字符串是否等於五個元音中的任何一個。但是,當我測試它來查看字符串中的元音字符是否等於'元音'時,我知道它們不相等。代碼的問題是下面的粗體部分。此外,當我嘗試做「一個」|| 「e」|| 「我」|| 「o」|| 「u」,我得到ISO C++禁止指針和整數之間比較的錯誤。我如何能夠檢查它們是否相同?感謝您的時間。爲什麼字符串的每個單個字符都不等於字符對等?

#include <iostream> 
#include <cstdio> 
#include <cstring> 
#include <string> 
#include <vector> 
#include <cmath> 
#include <cstdlib> 

using namespace std; 
int l, c; //l is amount of letters in password, c is amount of letters being inputted 
char letters[1000000]; //the letters being inputted 

vector <string> pass; //string vector of the stored passwords 
void rec(string current, int index, int x){ //determining all possible passwords 
    if (index >= 4){ 
     pass.push_back(current); 
    } 
    else{ 
     for (int i=0; i<c; i++){ 
      if (x<i){ 
       int old; 
       old = x; 
       x = i; 
       rec(current + letters[i], index+1, x); 
       x = old; 
      } 
     } 
    } 
} 
int main (int argc, char ** argv) 
{ 

    cin >> l >> c; 

    int x = -1; 

    for (int i=0; i<c ;i++){ 
     cin >> letters[i]; 
    } 

    sort(letters, letters + c); //sorted from least to greatest 

    rec("", 0, x); 
    for (int i=0; i<pass.size(); i++){ 
     int vl=0; //number of vowels 
     int nvl=0; //number of non-vowels (consonants) 

     for (int j=0; j<l; j++){ 
      **if (pass.at(0)[j] == 'a' || pass.at(0)[j] =='e' || pass.at(0)[j] =='i' || pass.at(0)[j] =='o' || pass.at(0)[j] =='u'){** 
       vl++; 
      } 
      else{ 
       nvl++; 
      } 
      if (j == l-1){ 
       if (vl >= 1 && nvl >= 2){ 
        cout << pass.at(0) << endl; 
       } 
      } 
     } 
    } 

    return 0; 
} 
+0

代碼的「加粗」的部分是,有兩個星號的部分 – bobtheboy

+0

看看if語句中有多個子句的其他例子。這個陳述正在做一些與你想要的不同的事情。 – jonsca

回答

3

在C++中,X || Y指:

  • 測試是否X是真實的。如果是這樣,整個表達式的結果是true
  • 否則,測試Y是否爲真。表達式的結果是Y的結果。

所以,你的代碼:

pass.at(0)[j] == 'a' || 'e' 

(省略對於現在的i等,因爲他們不改變任何東西)。

我們測試了pass.at(0)[j] == 'a'。那是錯誤的,所以現在我們測試'e'。不是說你沒有測試pass.at(0)[j] == 'e'。您剛剛測試了'e'。這與測試'e' != 0相同,這是正確的。所以,你的表達式求true在這一點(和沒有去到檢查'i'等)

你可能是爲了測試是否pass.at(0)[j]所持有的價值觀'a''e'等。如果是這樣,其中一個方法編碼是:

if (std::strchr("aeiou", pass.at(0)[j])) 

你應該在做這個之前確認j < strlen(pass.at(0));使用[]來生成超出界限的索引會導致未定義的行爲。

+0

感謝M.M如何檢查字符串中的任何字符是a,e,i,o還是u! – bobtheboy

3

因爲您使用的是||錯誤。的||部分兩側是「真或假」 expressin本身,所以你需要的東西,如:

if (pass.at(0)[j] == 'a' || pass.at(0)[j] == 'e' ...) 

否則,表情總是正確的,因爲||爲真當上表達的左邊或右邊是真實的,並且'e'由於不爲零而成立。

+0

謝謝Mats告訴我,pass.at(0)[j] =='a'|| 'e'...不是我想要的!這幫助我意識到那些不平等。 – bobtheboy

2

這不會做你認爲...

(pass.at(0)[j] == 'a' || 'e' || 'i' || 'o' || 'u') 

你需要明確比較,

char t = pass.at(0)[j]; 

if (t == 'a' || t == 'e' || t == 'i' || t == 'o' || t == 'u') {