【问题标题】:C++ how to pass string array in function and assign to a variable?C ++如何在函数中传递字符串数组并分配给变量?
【发布时间】:2018-04-01 03:11:05
【问题描述】:

我在编写一个简单的函数时遇到了这个错误。这是我的功能说明。

string studentName;
string courseTaken[3];
void setStudent(string, string[]); 

void Student::setStudent(string n, string a[])
{
   studentName= n;
   courseTaken = a;
}

这是我得到的错误:

在此行 courseTaken = a; 上,将 string* 分配给字符串 [3] 中的类型不兼容;

在我的代码中,我从未声明过任何指针或字符。

我不太明白这里出了什么问题。

【问题讨论】:

  • 使用std::arraystd::vector。这不是 C。
  • 规范由讲师提供。可以解释一下这不是 C 是什么意思吗?
  • C 数组不能这样工作。当你将它传递给一个函数时,你只是传递了一个指向第一个元素的指针。函数声明与void Student::setStudent(string n, string *a) 完全相同。通过“这不是 C”,@user202729 意味着您应该使用 C++ 容器而不是 C 数组,这有一些不直观的东西,尤其是当您尝试将它传递给函数时。他/她可能指的是在 C++ 内容之前教 C 内容的常见不良做法。
  • 你能改变什么,教练坚持什么不能改变?如果你不能改变任何东西,你就不能修复任何东西。

标签: c++ arrays


【解决方案1】:

您不能使用= 运算符将字符串数组string a[] 分配给数组courseTaken。表达式string a[] 等价于std::string*。这就是你得到编译器错误的原因。

这可能是你想要的:

#include <iostream>
using namespace std;

class Student
{
    public:
        string studentName;
        string courseTaken[3];
        void setStudent(string n, string a[]); 
};

void setStudent(string n, string a[]); 

void Student::setStudent(string n, string a[])
{
   studentName = n;
   for(int i=0; i < sizeof(courseTaken)/sizeof(courseTaken[0]); i++)
    courseTaken[i] = a[i];
}

int main()
{
    Student student;

    string courses[3] = {"Cobol","C++","Fortran"};
    student.setStudent("Eva", courses);

    for (int i = 0; i < 3; i++){
        cout << student.courseTaken[i] << endl;
    }

    return 0;
}

输出:

Cobol                                                                                                                                        
C++                                                                                                                                          
Fortran 

【讨论】:

    【解决方案2】:

    您似乎不了解C格式数组的数组decay机制。 对于许多上下文,数组名称将被解释为指向数组第一个元素的指针。这个指针是一个prvalue,就像this 指针一样,你不能分配给它。 “现代 Cpp 方式”(C++11)是使用 std::array,它重载了 =operator 并存储数组的大小,以便在传递给函数时不会衰减。 第二种方式是传递引用,使用template可以保证数组的大小,然后使用std::memcpy。你可以添加一个参数来存储数组的大小,然后你也可以使用memcpy。 希望大家用第一种方式,别忘了-std=c++11

    【讨论】:

      【解决方案3】:

      这是因为您将数组传递给变量,这就是发生此错误的原因。要解决此问题,您可以在参数中使用指针来解决此问题。把你的函数改成这个。

      void Student::setStudent(string n, string* a)
      {
         studentName= n;
         courseTaken = a;
      }
      

      【讨论】:

        猜你喜欢
        • 2017-04-05
        • 1970-01-01
        • 2015-09-09
        • 2019-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-28
        • 1970-01-01
        相关资源
        最近更新 更多