找到char *变量不起作用

时间:2010-08-30 04:15:20

标签: c++ find stdmap

我想知道为什么我有这样的内存错误:

问题出现在char * value = aMap.find(keync) - > second

如果我把manualy char * value =“key0”就可以了!!!

using std::map;
map <char*, char*> aMap;

void search(const char* key) {
    const int LEN = strlen(key);

    char* keync = new char[LEN];

    for (int i= 0; i < LEN; i++) {
       keync[i] = key[i];
    }

    char* value = aMap.find(keync)->second;

    printf("%s", value);

    delete[] keync;
}

int _tmain(int argc, _TCHAR* argv[])
{
    a["key0"] = "value0";
    search("key0");

    return 0;
}

6 个答案:

答案 0 :(得分:2)

您需要在数组长度上加1:

char* keync = new char[LEN+1];

你在你分配的字符串之外终止了。

(另外,你是在初始化地图吗?)

答案 1 :(得分:1)

正如其他人指出的那样,你最好使用std::string。现在,对于实际问题,为什么你不能找到字符串是因为你在地图中存储指针,即地图的关键是指针变量。您在地图中插入了char*,但是当您尝试查找时再次执行new。这是一个完全不同的指针(尽管它们指向的字符串值相同),因此您的查找将失败。

答案 2 :(得分:0)

一个显而易见的问题是:

delete keync;

因为您使用了新的[],所以应该是:

delete[] keync;

答案 3 :(得分:0)

你最好使用std :: string而不是char *。使用std :: string的另一个好处是你可以避免内存泄漏。

另一种解决方案是提供带比较器功能的map,否则他们不会比较每个char *的内容,而是指向地址。以下示例改编自Sgi的std::map文档:

struct comp
{
  bool operator()(char* s1, char* s2) const
  {
    return strcmp(s1, s2) < 0;
  }
};

map<char*, char*, comp> stringMap;

答案 4 :(得分:0)

好好寻找初学者,你应该放弃所有的char *并使用std::string,这可能会让你的问题消失。

供参考:
keync[LEN] = '\0'; //这是错误的,并且将超过分配的数组

的结尾

复制关键参数是错误的。试试这个尺寸:

using std::map;
map <char*, char*> aMap;

void search(const char* key) {
    const int LEN = strlen(key);

    char* keync = const_cast<char*>(key);

    char* value = aMap.find(keync)->second;

    printf("%s", value);
}

int main(int argc, char** argv)
{
    aMap["key0"] = "value0";
    search("key0");

    return 0;
}

您遇到的问题是因为您将keync分配为strlen(key),而不计算空终止符。在您的复制循环中,您使用key的最后一个字符覆盖空终止符。

复制输入字符串的整个想法是错误的,我已经用我的解决方案中的const转换替换它,因为它更有意义(就此而言)。

答案 5 :(得分:0)

using std::map;
map <char*, char*> aMap;

首先,这个地图不会比较字符串(搜索内部)而是地址。所以基本上你不会通过输入字符串文字来找到std :: map :: search的任何内容。

void search(const char* key) {
    const int LEN = strlen(key);

    char* keync = new char[LEN];

    for (int i= 0; i < LEN; i++) {
       keync[i] = key[i];
    }

此时您有未终止的字符串,但在您的代码中无关紧要

    char* value = aMap.find(keync)->second;

这里你通过比较指针值(地址)来执行搜索,因此返回的map迭代器无效(它等于aMap.end()),因此它具有null或未分配的指针作为second成员

    printf("%s", value);

    delete[] keync;
}

int _tmain(int argc, _TCHAR* argv[])
{
    a["key0"] = "value0";
    search("key0");

    return 0;
}

我希望它能解释你为什么要使用std :: string而不是char *