繁体   English   中英

用char *变量查找不起作用

[英]find with char* variable doesnt work

我想知道为什么我有一个内存错误:

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

如果我手动输入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;
}

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

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

您在分配的字符串之外终止为null。

(此外,您正在初始化aMap吗?)

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

一个明显的问题是:

delete keync;

因为您使用了new [],所以它应该是:

delete[] keync;

您最好使用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;

好吧,对于初学者,您应该删除所有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的最后一个字符覆盖null终止符。

复制输入字符串的整个想法是错误的,我在我的解决方案中将其替换为const,因为这样做更有意义(就目前而言)。

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;

在这里,您通过比较指针值(地址)来执行搜索,因此返回的地图迭代器无效(等于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 *

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM