类型为" char *"不能用于初始化类型" char"的实体。

时间:2016-05-06 22:52:28

标签: c++ string struct char

我已经看到一些线程处理类似的错误,但他们都在处理我遇到的问题的不同变化(代码:"我太绿了理解他们")。

    #include <iostream>
    #include <array>
    #include <sstream>
    using namespace std;

    struct StudentRecord
    {
        char name[20];
        int id;
        float gpa;
    };

    int main()
    {
        cout << "Enter your name:" << endl;
        char nameInput[20];
        cin >> nameInput;

        cout << "Enter your student ID:" << endl;
        int idInput;
        cin >> idInput;

        cout << "Enter your GPA:" << endl;
        float gpaInput;
        cin >> gpaInput;

        StudentRecord TESCStudent =
        { { nameInput }, idInput, gpaInput }; // TROUBLE STARTS HERE

    cout << "Name: " << TESCStudent.name << "\nID: " << TESCStudent.id << "\nGPA: "
        << TESCStudent.gpa << endl;
}

StudentRecord TESCStudent = {...}初始化程序会出现以下错误: 错误C2440:&#39;初始化&#39; :无法转换为&#39; char [20]&#39;去#char;&#39; IntelliSense:类型&#34; char *&#34;的值不能用于初始化类型&#34; char&#34;

的实体

我意识到字符串可以解决很多问题,但项目要求我们将名称作为20个字符的数组。

这是我第一次使用结构体,所以我可能会做一些没有意义的可怕的事情,请放轻松我!

3 个答案:

答案 0 :(得分:1)

您写道:

  

StudentRecord TESCStudent = { { nameInput }, idInput, gpaInput };

基本上:你不能这样做。 C风格的数组具有不直观的语法和语义;除了单独列出每个元素之外,没有办法使用另一个C风格的数组来初始化C风格数组的元素。

我的建议是根本不使用它们。如果您使用std::string而不是名称数组,那么您只需编写StudentRecord TESCStudent = { nameInput , idInput, gpaInput };即可。如果用户输入长度为20个字符或更长的名称,这也可以解决代码导致缓冲区溢出的问题。

如果由于课程要求而被迫坚持使用char数组,那么我建议通过直接读入数组并添加溢出保护和错误检查来避免这个问题,例如:

StudentRecord TESCStudent = {};

 cout << "Enter your name:" << endl;
 cin >> setw(sizeof(TESCStudent.name)) >> TESCStudent.name;

 cout << "Enter your student ID:" << endl;
 cin >> TESCStudent.id;

 cout << "Enter your GPA:" << endl;
 cin >> TESCStudent.gpa;

 if ( !cin )
 {
     cout << "Invalid input, sorry.\n";
     return EXIT_FAILURE;
 }

答案 1 :(得分:0)

@yinch正确地指出我将idInput视为值而不是数组。把它写成:

StudentRecord TESCStudent = { { *nameInput }, idInput, gpaInput };

会删除错误,但只会将nameInput[20]中的第一个值添加到TESCStudent.name[20]。我决定将这些值添加到TESCStudent中:

    StudentRecord TESCStudent; // create a variable from StudentRecord

    cout << "Enter your name:" << endl; // prompt for name
    char nameInput[20];
    cin >> nameInput;

    for( size_t i = 0; i < 20; i++ ) // assign each element of nameInput
                                     // to TESCStudent.name explicitly
    {
        TESCStudent.name[ i ] = nameInput[ i ];
    }

    cout << "\nEnter your student ID:" << endl; // prompt for ID
    int idInput;
    cin >> idInput;
    TESCStudent.id = idInput; // assign idInput to TESCStudent.id

    cout << "\nEnter your GPA:" << endl; // prompt for GPA
    float gpaInput;
    cin >> gpaInput;
    TESCStudent.gpa = gpaInput; // assign gpaInput to TESCStudent.gpa

for循环通过明确地将每个数组值分配给TESCStudent.name来解决问题。谢谢你的帮助!

答案 2 :(得分:-1)

将问题行更改为:

    StudentRecord TESCStudent =
        { { *nameInput }, idInput, gpaInput };

解决了这个问题。

关于字符串的要记住的是它们本身就是数组。 所以在你的例子中,&#34; nameInput&#34;它本身并不包含char值,它实际上包含指向第一个char值的指针。

区分变量(保持值)和指针(指向保存值的位置的地址指针)是字符串与其他文字值(如int和float)之间差异的关键部分

通过使用星号预先修复nameInput(指针)表示您需要指向的值。