这是我提取密钥并将其存储在地图中的以下代码
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”它正常工作。如何克服这个?
答案 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年那样编写程序。