stl map key find error

时间:2015-10-15 12:22:15

标签: c++

这是我提取密钥并将其存储在地图中的以下代码

char * getData(char * str,char * pattern)
    {
      char *strTemp = new char[strlen(str)];
      strcpy(strTemp,str);
      char *ExtratedPatternData= (char *) NULL;
      int i=0;
      int LoopCount;

      ExtratedPatternData=strtok(strTemp," ");

      while(ExtratedPatternData)
        {
          if(strcmp(ExtratedPatternData,pattern) == 0)
        {
          ExtratedPatternData=strtok(NULL," ");
          LoopCount=atoi(ExtratedPatternData);

          for(i=0;i<LoopCount;i++)
            {
              if(ExtratedPatternData[2] == '\'')
            ExtratedPatternData=strtok(NULL,"'");       
              else
            ExtratedPatternData=strtok(NULL," ");         
            }
          delete strTemp;
          return ExtratedPatternData;
        }

          ExtratedPatternData=strtok(NULL," ");
          LoopCount=atoi(ExtratedPatternData)+1;

          for(i=0;i<LoopCount;i++)
        {
          if(ExtratedPatternData[2] == '\'')
            ExtratedPatternData=strtok(NULL,"'");       
          else
            ExtratedPatternData=strtok(NULL," ");         
        }
        }
      delete strTemp;  
      return "nill";
    }  

int main()
    {
      char * Instr;
      char * Key;
       FILE *pInFile;
      size_t len = 0;
     int Cntr=0;
           pInFile = fopen ("file.txt", "r");

        map<char *,int> History;

     while((getline (&Instr, &len , pInFile )!=-1))
       {
         Key=getData(Instr,"54001");

         if(History.count(Key))
           {
             cout<<History.find(Key)->second<<endl;
           }
         else
           {

         History[Key]=Cntr++;
           }
fclose(pInFile);
    return 0;
    }

在上面我试图逐行读取文件的内容。并根据文本“KEY”我提取数据并将其存储在我的MAP中。 如果(History.count(Key))将始终为匹配的模式返回0。但是如果从“getData”函数返回“nill”它正常工作。如何克服这个?

2 个答案:

答案 0 :(得分:3)

这里的问题很可能是您使用指针作为密钥。这将使实际指针成为键,而不是它们指向的字符串。如果要将字符串用作键,请使用std::string

答案 1 :(得分:1)

您的一个问题是您使用的是指针,map默认情况下会将元素与std::less(即<)进行比较。

还存在strTemp一个字符太短,getData返回悬空指针以及delete应该是delete[]的问题 - 所有问题这将导致未定义的行为。

如果您迫切想要使用C字符串,则需要为地图定义自己的比较:

bool less_string(const char* lhs, const char* rhs)
{
    return strcmp(lhs, rhs) < 0;
}

// ...

map<char *, int, less_string> History;

当然,您还需要修复悬空指针问题。并且内存溢出。

更好的解决方法是使用std::string及其成员代替C“string”库。
通常没有必要像1969年那样编写程序。