2013-03-07 98 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 *可能更有意义。

相关问题