【问题标题】:Problems with transforming a c++ string to a const char *将 c++ 字符串转换为 const char * 的问题
【发布时间】:2020-01-20 14:32:44
【问题描述】:

我正在尝试从 c++ 字符串创建一个指向常量字符数组的指针。 在最后四行中,我将三个字符串添加到一个字符串中。这应该用于创建指向常量数组的指针。然后应该返回该指针以在另一个函数中使用。当我逐步调试时,函数末尾的“cout”显示了正确的行为。当我查看主函数中的返回值时,它指向垃圾数据。返回指针时我做错了什么?

const char *checkMultiID(void){
    string startID = "USB0::0x2A8D::0x0101::";
    string usbID = "MY54500604";
    string endID = "::0::INSTR";
    char answerID;
    int correctFunctionInput = 0;

    cout << "ID = " << usbID << "? [Y/N]" << endl;
    scanf("%c", &answerID);

    while(correctFunctionInput == 0){
        if ((answerID == 'Y') || (answerID == 'N')){
            correctFunctionInput = 1;
        }
        else{
            cout << "Incorrect Input. Please repeat." << endl;
            scanf("%c", &answerID);
        }
    }

    if (answerID == 'N'){
        cout << "Please Type in the ID like MY..." << endl;
        getline (cin, usbID);
    }

    string fullID = startID + usbID + endID;
    const char *idChar = &fullID[0];
    cout << idChar << endl;

    return idChar;
}

【问题讨论】:

  • 那是因为字符串在函数末尾超出范围,所以指向字符串数据的char*之后将不再有效。
  • 所以我需要创建一个全局字符串?
  • @Alex 直接返回整个std::string
  • 好的,它正在使用全局字符串。还有其他我没有想到的不需要全局变量的解决方案吗?

标签: c++ pointers char constants


【解决方案1】:

您正在返回一个指向由容器处理的数据的指针,即 c++ 字符串,它超出了范围,因此在函数末尾被解构。要获得所描述的确切行为,您想要做的是使用堆分配,如下所示:

char* result = new char[fullID.length()+1];
std::copy(string.c_str(),string.c_str()+fullID.length()+1,result);

你应该直接返回 c++ 字符串,因为我保证你最终会忘记释放这个字符串。

const string checkMultiID(){
  return fullID;
}

【讨论】:

    【解决方案2】:

    您可以在 fullID 中添加静态关键字,例如:

    static string fullID = startID + usbID + endID;
    

    更好的选择是只返回字符串。

    编辑:

    1201programalarm 是对的。

    为避免这种情况,您可以这样做:

    static string fullID;
    fullID  = startID + usbID + endID;
    

    在这种情况下,在第二次调用 checkMultiID() 后,第一次调用的值将被删除。

    如果您将函数返回类型更改为 std::string 那么您可以只返回 fullID 并在另一个函数中调用返回字符串的 c_str() 方法。

    const char * result = checkMultiID().c_str();
    

    这将解决您的问题,这是最简单的解决方案。

    【讨论】:

    • 不是一个好的解决方案。这只会在第一次构建字符串,并且会导致后续调用具有不同输入的错误返回字符串。
    • 你的“最简单的解决方案”不能解决任何问题,它总是错的。
    • const char * result = checkMultiID().c_str(); 也不起作用。表达式一结束,result 就会变得悬空。它无法使用。您需要将结果存储到实际的std::string
    猜你喜欢
    • 2013-02-15
    • 2013-07-25
    • 2014-05-16
    • 2012-03-22
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多