2013-03-07 96 views
1

代碼嘗試確定兩個字符串是否具有相同的模式。錯誤:表達式必須具有大小類類型()

#include <iostream> 
#include <vector> 
#include <string> 
#include <map> 
#include <sstream> 


bool findMatch(char * s1, char * s2){ 
    std::map<char, std::string> words; 
    std::istringstream iss(s1); 
    std::string word; 
    //for (std::string::size_t i = 0; i < s2.size(); ++i)  //line 1 
    //for (int i = 0; i < s2.size(); ++i)      //line 2 
    { 
     if (!(iss >> word)) 
      return false; 
     std::string& mapping = words[s2[i]]; 
     if (mapping == "") 
      mapping = word; 
     else if (mapping != word) 
      return false; 
    } 
    return !(iss >> word); 
} 

int main(int argc, char * argv[]){ 
    bool b = findMatch("red blue blue red red yellow", "abbaac"); 
    std::cout << b << std::endl; 
    return 0; 
} 

問題: 我曾兩次嘗試,1號線和2號線,他們都沒有工作

line 1, Error: class "..." has no member "size_t"

line 2: Error: char * s2 Expression must have class type

任何想法?

+2

's2'是一個'char *',所以它沒有'size()'成員函數。你可以使用'std :: strlen()'來確定長度(雖然在字符串長度上會是O(n))。另外,它是'std :: string :: size_type',而不是'std :: string :: size_t'。 – jogojapan 2013-03-07 01:45:21

回答

3

你有點不一致。您使用char*並使用std::string s,std::string具有使用for循環中使用的size方法的好處。 std::string沒有std::string::size_t,它可以是size_tstd::string::size_type

我會將您的char*參數替換爲const std::string&,這樣就可以按照您的預期工作。

-1

嘗試改用1號線

for (size_t i = 0; i < strlen(s2); ++i) 
+0

同樣的錯誤:char * s2表達式必須有類型 – HoKy22 2013-03-07 01:44:01

+0

@ShafikYaghmour Doh!我錯過了那個細節。 – 2013-03-07 01:58:41

+0

@ShafikYaghmour I * am *一個在線編譯器......或者至少我以爲我是;-(我將不得不記得在未來使用它) – 2013-03-07 02:14:59

3

至少有幾個問題,size_t不是字符串的一部分,s2也不std::string所以你需要使用類似strlen

for (size_t i = 0; i < strlen(s2); ++i) 

這意味着您需要包括cstring

#include <cstring>  

爲了一致起見,使用std::string代替char *可能更有意義。

相關問題