将std :: string从const_iterator转换为char *?

时间:2014-06-03 14:33:12

标签: c++ arrays stdstring

我有一个类型的迭代器:

std::map<int, std::string>::const_iterator

正如您所见,地图正在存储std::strings

我正在尝试使用以下方法提取值:

x.second.c_str()

并将其传递给函数以调用regex.h函数regexec(),该函数接受char*。做这个的最好方式是什么?我从这种方法中得到basic_string编译错误。

更新

std::map<int, std::string> map;
.
.
.
std::map<int, std::string>::const_iterator f = map.find("something");
if (f != map.end()) {
    my_func(f->second.c_str());   
.
.
.
.

void my_func(char* c){
    std::cout << c << std::endl;   //This causes a segmentation fault
}

2 个答案:

答案 0 :(得分:0)

你应该做

int error=regexec(&regex,cppstring.c_str(),nmatch,pmatch,eflags);

regexec()的第二个参数和std :: string :: c_str()的返回值都是(const char *),所以这可能不是你问题的原因。

您应该发布编译器错误消息以及您怀疑导致问题的代码部分。

答案 1 :(得分:0)

这是一个非常疯狂的猜测,尽管我可能会因为给出的矛盾和不完整的信息而误导:

  • 我假设您有一个以char*为参数的函数,例如就像问题中提供的my_func一样。
  • 我进一步假设您尝试取消引用某种const_iterator,最终获得对const字符串的引用,并在其上调用c_str()
  • 下一个假设是您希望将该调用的结果传递给您的函数。

看起来有点像这样:

void my_func(char*);

int main() {
  std::map<int, std::string> theMap;
  // ...
  std::map<int, std::string>::const_iterator cit = theMap.find(3);
  assert(cit != theMap.end());


  my_func(cit->second.c_str()); //problematic line
}

在这种情况下,您应该收到编译错误,因为c_str()会返回const char*。虽然你的函数需要char*,但两者不兼容。

但是,我的假设存在一些缺陷:

  • 错误应该是从const char*char*的转换,不应该对basic_string
  • 做任何事情
  • 它与regexec无关(但您的示例代码都没有)
  • 它不能导致段错误,因为它不能编译(但这个矛盾已经存在于你的问题中)

如果你对问题有所了解,我将能够就出现问题的方式提供更具体的提示。