【问题标题】:Passing user input to function with char* parameters使用 char* 参数将用户输入传递给函数
【发布时间】:2011-10-18 23:59:37
【问题描述】:

我是新手,所以我知道这可能很简单。

我有这样的功能

void GroceryList::addRecord(char* itemName, char* itemType, char rating){
//do some code;
}

我的问题是我无法创建正确的参数以传递给函数。

I've tried something like
void main() {
    string itemName;
    cin >> itemName;
    string itemType;
    cin >> itemType;
    string rating;
    cin >> rating;

gradeBook.addRecord(itemName, itemType, rating);
}

我没想到它会像函数期望的那样工作 char* 但我一生都无法弄清楚如何将用户输入输入到我可以传递给函数的变量中。我已经搜索了 13 个小时来尝试我能找到的东西,但到目前为止还没有运气。

【问题讨论】:

  • 你得到什么错误信息?

标签: c++ pointers parameters arguments function-pointers


【解决方案1】:

将函数原型改为

void GroceryList::addRecord(string itemName, string itemType, string rating){
//do some code;
}

我还建议在您的代码中使用 const 正确性,如果您不打算更改参数,请使用 const 通过 ref 传递它们(以提高性能)

void GroceryList::addRecord(const string& itemName, const string& itemType, const string& rating){
//do some code;
}

一切都取决于您没有描述的实际方法体。

【讨论】:

    【解决方案2】:

    您可以使用字符串,然后在传递时只需在字符串上调用c_str()。对于评级,您可以使用char

    然后调用函数如下:

    gl.addRecord(itemName.c_str(), itemType.c_str(), rating);
    

    为此,您需要将函数签名更改为 const char* 而不是 char*

    【讨论】:

      【解决方案3】:

      好吧,不要使用char*

      void GroceryList::addRecord(const std::string& itemName, const std::string& itemType, const std::string& rating) { /* ... */ }
      

      您可以使用c_str() 成员函数从string 获取const char*(不是char*),例如itemName.c_str(),但除非您正在与 C 库进行互操作,否则您不需要。

      【讨论】:

        【解决方案4】:

        使用 std::string::c_str();这就是它的用途:

        gradeBook.addRecord(itemName.c_str(), itemType.c_str(), rating.c_str());
        

        这个函数返回一个const char *。但是,addRecord 函数似乎不是 const 正确的,因此您需要修复它。

        【讨论】:

        • 如果可以,请不要使用 char *。
        【解决方案5】:

        简单的答案是你不能。如果可以修改 GroceryList::addRecord,改为使用std::string const&。如果你 不能修改,那你要问一个问题:为什么要使用 char*?有两种可能的答案:作者没看懂 const,还是懒得用了,其实并没有修改 指向字符串。在这种情况下,类似 const_cast<char*>( itemName.c_str() )可以使用;很啰嗦,但是 当代码的作者不做他的工作时,这就是你付出的代价 正确。另一个可能的答案是代码确实修改了 通过指针的东西。在这种情况下,唯一的解决方案涉及 将字符串复制到char[],并传递它。

        【讨论】:

        • 您可以传递 &itemName[0]。不过,您可能需要手动终止它。
        • @ymett 如果被调用的函数确实修改了某些东西,那将导致未定义的行为。如果被调用的函数没有修改某些内容,我更喜欢const_cast:它更冗长,但它清楚地说明了发生了什么。
        • 为什么会是未定义的行为?
        • @ymett 因为标准是这样说的:-)。在实践中,我无法想象一个合理的实现会导致问题,只要被调用者没有超出实际大小,并且在被调用者拥有指针期间没有人对字符串对象做任何事情.
        • 标准说 std::string s(1); *&s[0] = 'a';是未定义的行为吗?
        猜你喜欢
        • 1970-01-01
        • 2016-03-12
        • 2021-04-28
        • 1970-01-01
        • 2022-06-10
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多