首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"char *“类型的值不能用于初始化"char”类型的实体。

"char *“类型的值不能用于初始化"char”类型的实体。
EN

Stack Overflow用户
提问于 2016-05-06 22:52:27
回答 3查看 6.8K关注 0票数 0

我看到了一些处理类似错误的线程,但它们都处理了与我所遇到的问题不同的问题(代码是:“我太绿了,无法理解它们”)。

代码语言:javascript
复制
    #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:‘初始化’:不能从'char 20‘转换为'char’IntelliSense:不能使用"char *“类型的值来初始化"char”类型的实体。

我意识到字符串可以解决很多问题,但是这个项目要求我们获得一个20个字符数组的名称。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-09 00:56:54

你写道:

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

基本上:你不能那样做。C样式数组具有不直观的语法和语义;除了单独列出每个元素之外,没有任何方法可以使用另一个C样式数组初始化C样式数组的元素。

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

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2016-05-07 21:20:53

@yinch正确地指出,我将idInput视为一个值而不是数组。将其写成:

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

移除错误,但只将第一个值从nameInput[20]添加到TESCStudent.name[20]。我决定将以下值添加到TESCStudent中:

代码语言:javascript
复制
    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来解决这个问题。谢谢你的帮助!

票数 0
EN

Stack Overflow用户

发布于 2016-05-06 23:19:41

将问题线更改为:

代码语言:javascript
复制
    StudentRecord TESCStudent =
        { { *nameInput }, idInput, gpaInput };

解决问题。

关于字符串,需要记住的是,它们本身就是数组。因此,在您的示例中,"nameInput“本身并不包含char值,它实际上持有指向第一个char值的指针。

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

通过用星号预先固定nameInput (指针),表示您想要指向的值。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37082518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档