无法从字符串类中读取字符串

Posted

技术标签:

【中文标题】无法从字符串类中读取字符串【英文标题】:Cannot read in string from string class 【发布时间】:2013-02-12 17:04:41 【问题描述】:

只是一个简短的问题,我将在路上。当我尝试使用字符串类读取字符串时,为什么会出现错误?我收到的错误是:“没有运算符“>>”匹配这些操作数/操作数类型是 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,但是当我将函数声明和定义更改为字符串类时,它就不起作用了。

【问题讨论】:

我认为您需要了解更多信息。 string 是 类似于 的字符数组。所以string fname 会像char fname[19] 一样something。所以不需要[] 在你的情况下使用字符串。当你需要一个字符串数组时使用string fname[]!!! :) 我确实需要一个字符串数组。因此我使用字符串 fname []。如果您查看注释掉的代码,您会看到我正在尝试替换 char fname[][NAME_LENGTH] - 一个二维数组。 哦,那么cin &gt;&gt; fname[i] 会将输入放到 fname 数组的第 i 个位置。你不能这样做 cin &gt;&gt; fname 因为 fname 不是一个字符串,而是一个字符串数组。 (std::cin 的运算符 &gt;&gt; 不知道当 &gt;&gt; 运算符的右侧是字符串数组时该怎么办!!所以它应该给出编译错误。)你仍然需要研究如何传递参数。我建议将它们作为指针或引用传递。 @Deamonpog 非常感谢您的回复。所以我将函数头更改为包含“std::string& fname[]”,对吗? 是的,它被称为函数的签名 【参考方案1】:

您的参数fnamelnamephonebday 被声明为std::string arg[],对于一个参数被转换为std::string* arg。也就是说,它们是指向std::string 的指针。如果你想传递一个std::strings 的数组,你只会有一个用std::string arg[] 声明的参数。

如果您为每个参数传入一个 std::string,那么您真正想要的是一个引用类型。例如,fname 应该是 std::string&amp; fname。该引用允许将std::string 传递给函数而不进行复制,因此当您使用&gt;&gt; 读取它时,您会修改原始对象。

【讨论】:

【参考方案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*。如果需要增加大小,您也不必处理删除/重新分配。

【讨论】:

【参考方案3】:

fnamestd::string 的数组。数组的使用是否是您之前使用 C 字符串 - char fname[] 的后遗症?如果是这样,您可以改为传递std::string&amp;

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

【讨论】:

如果您查看注释掉的代码,原始 cString 是一个二维数组(即 char fname[MAX_FRIENDS][NAME_LENGTH])。 std::string& fname 是否仍然适用于此? 啊,不,这行不通。如果你想要一个字符串数组,你必须决定使用哪个索引,然后流入fname[index]。或者,如果您想添加到变量数组的末尾,您可以传递 std::vector&lt;std::string&gt;&amp;push_back 一个新字符串给它。 (如果您确认任一选项是否适合您的需求,我会更改答案。)【参考方案4】:

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

【讨论】:

以上是关于无法从字符串类中读取字符串的主要内容,如果未能解决你的问题,请参考以下文章

从 Kotlin MultiPlatform (KMM) 中的共享类中读取字符数组

如何从另一个类中获取字符串变量

GSON没有正确读取值

无法从 excel 列中读取字符串值

[转]C# JSON格式的字符串读取到类中

无法从 Win32_OperatingSystem 类中获取“描述”