1

只是一个简短的问题,我会在路上。当我尝试使用字符串类读取字符串时,为什么会出现错误?我收到的错误是:“没有运算符“>>”匹配这些操作数/操作数类型是 std::istream >> std::string *”

我开始使用类而不是 cStrings。不幸的是,当我尝试使用 cin 读取字符串时,我不断收到错误消息。例如:

void ProcessEditMenuItems( int menu_choice, std::string fname[], std::string lname[], 
                    std::string phone[], std::string bday[]     /*char fname[][NAME_LENGTH], char lname[][NAME_LENGTH], char phone[][NAME_LENGTH], 
                       char bday[][NAME_LENGTH]*/ )
{
switch ( menu_choice )
{
    case 1:
        std::cout << "\nEnter new first name: ";
        std::cin >> fname;
    break;
    case 2:
        std::cout << "\nEnter new last name: ";
        std::cin >> lname;
    break;
    case 3:
        std::cout << "\nEnter new phone number: ";
        std::cin >> phone;
    break;
    case 4:
        std::cout << "\nEnter new birthday: ";
        std::cin >> bday;
    break;
}
}

上面的代码适用于普通的 cStrings,但是当我将函数声明和定义更改为字符串类时,它不起作用。

4

4 回答 4

3

您的参数fname, lname,phonebday被声明为std::string arg[]参数转换为std::string* arg。也就是说,它们是指向std::string. std::string arg[]如果你想传递一个 s 数组,你只会有一个声明的参数std::string

如果你std::string为每个参数传入一个,那么你真正想要的是一个引用类型。例如,fname应该是std::string& fname。引用允许std::string在不复制的情况下将 a 传递给函数,因此当您读入它时,>>您可以修改原始对象。

于 2013-02-12T17:07:17.510 回答
2

您实际上是在传递字符串数组,但应该传递对字符串的非常量引用。

将您的函数原型更改为:

void ProcessEditMenuItems(
  int menu_choice,
  std::string& fname,
  std::string& lname,
  std::string& phone,
  std::string& bday
)

它应该没问题。

从 C 字符串转换为 时std::strings,您可以使用以下转换表:

Old parameter | New parameter      | Description
const char*   | const std::string& | Non-modifiable parameter
char*         | std::string&       | Modifiable string

最好的事情是你在改变它时不需要关心字符串的大小,而你必须使用char*. 如果需要增加大小,您也不必处理删除/重新分配。

于 2013-02-12T17:07:44.490 回答
1

fname是一个数组std::string。数组的使用是您之前使用 C 字符串的后遗症char fname[]吗?std::string&如果是这样,您可以改为通过

void ProcessEditMenuItems(int menu_choice,
                          std::string& fname,
                          std::string& lname,
                          std::string& phone,
                          std::string& bday)
于 2013-02-12T17:06:38.840 回答
0

此错误类似于int arr[2]; arr = 1;
fname 是包含字符串对象的数组。"std::cin >>" 表示从标准输入中提取字符串。我们只能将字符串对象分配给 fname[0], fname[1] ....改为
尝试;std::cin >> fname[0]

于 2013-02-12T17:29:16.393 回答