【问题标题】:Converting std::string from const_iterator to char*?将 std::string 从 const_iterator 转换为 char*?
【发布时间】:2014-07-23 22:50:15
【问题描述】:

我有一个迭代器类型:

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
}

【问题讨论】:

  • 什么是 x?如果它是一个迭代器,你应该做 x->second.c_str()
  • 请提供SSCCE,以便其他人了解您的具体问题。
  • 1) regexec 似乎接受const char*,这是一个巨大的差异。 2) 如果你去找机械师说“我的车出了点问题”,他将无法提供帮助。此处同样适用:显示 car 代码并准确告诉我们 什么 有问题,即提供错误消息。
  • x->second.c_str() 也许?

标签: c++ arrays stdstring


【解决方案1】:

你应该这样做

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

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

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

【讨论】:

    【解决方案2】:

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

    • 我假设您有一个以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 无关(但您的示例代码也没有)
    • 它不会导致段错误,因为它无法编译(但您的问题中已经存在这种矛盾)

    如果您对这个问题有更多了解,我将能够就问题所在提供更具体的提示。

    【讨论】:

      猜你喜欢
      • 2010-11-14
      • 2011-07-23
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 2011-08-02
      • 2013-09-10
      • 2012-10-31
      相关资源
      最近更新 更多