2016-05-06 17 views
0

Ich habe ein paar Threads gesehen, die sich mit ähnlichen Fehlern befassen, aber sie haben sich alle mit verschiedenen Variationen des Problems von dem einen I befasst (Code für: "Ich bin zu grün, um ihnen einen Sinn zu geben").Ein Wert vom Typ "char *" kann nicht verwendet werden, um eine Entität vom Typ "char" zu initialisieren

#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; 
} 

Die StudentRecord TESCStudent = {...} initializer gibt die folgenden Fehler: Fehler C2440: 'initialisieren': Wert des Typs: aus 'char [20]' to 'char' IntelliSense nicht konvertieren "char *" kann nicht verwendet werden, um eine Entität vom Typ "char" zu initialisieren

Ich weiß, dass eine Zeichenfolge eine Menge Probleme lösen würde, aber das Projekt forderte, dass wir den Namen als 20-Zeichen-Array erhalten.

Dies ist das erste Mal, dass ich ein Struct nutze, damit ich etwas Grässliches tun kann, ohne es zu wollen, bitte geh einfach zu mir!

Antwort

1

Sie schrieb:

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

Grundsätzlich gilt: Sie kann das nicht tun. C-artige Arrays haben eine nicht intuitive Syntax und Semantik; und es gibt keine Möglichkeit, die Elemente eines C-artigen Arrays mit einem anderen C-artigen Array zu initialisieren, als jedes Element einzeln aufzulisten.

Mein Rat wäre, sie überhaupt nicht zu verwenden.Wenn Sie anstelle des Namensarrays std::string verwenden, können Sie einfach StudentRecord TESCStudent = { nameInput , idInput, gpaInput }; schreiben. Dies würde auch das Problem beheben, dass Ihr Code einen Pufferüberlauf verursacht, wenn die Person einen Namen mit einer Länge von 20 Zeichen oder mehr eingibt.

Wenn Sie wegen Kursanforderungen mit dem char-Array zu halten sind gezwungen, dann würde ich direkt in das Array durch das Lesen, um das Problem zu vermeiden empfehlen und Überlaufschutz und Fehlerüberprüfung hinzufügen, zum Beispiel:

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; 
} 
+0

Ich bin nicht 100% klar, wie Ihr Code die Eingabe auf 20 Zeichen begrenzt. Können Sie das näher ausführen? Außerdem war ich gezwungen, das Array zu benutzen (was saugte), aber ich bin daran interessiert, wie Sie direkt in das Array lesen, das werde ich in Zukunft versuchen! –

+0

@KeeperofSecrets 'setw' legt die maximale Größe für den nächsten Lesevorgang fest (inkl. Nullterminierung, wenn es sich um ein char-Array handelt) –

+0

Cool. Dies ist eine großartige Lösung, viel sauberer und eleganter als die For-Schleife, die ich verwendet habe. –

-1

Ändern der Problemzeile:

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

behebt das Problem.

Die Sache, an die man sich bei Strings erinnert, ist, dass sie selbst Arrays sind. In Ihrem Beispiel enthält "nameInput" selbst keinen char-Wert, sondern enthält einen Zeiger auf den ersten char-Wert.

zwischen Variablen Erkennungsmerkmal (der Wert halten) und Zeiger (die Adresszeiger sind an Orte zeigen, die den Wert halten) ist ein wichtiger Teil der Differenz zwischen Streichern und anderen Literalwerte (wie int und float)

Durch die Voreinstellung des Namenseingangs (Zeiger) mit einem Sternchen wird angezeigt, dass Sie den Wert haben möchten, auf den der Zeiger zeigt.

+0

Das beantwortet die große Frage. Ich wusste, dass mit der Art, wie ich das Char-Array verwendete, etwas nicht stimmte, aber ich konnte nicht herausfinden, wie ich es beheben sollte. Übrigens fügt '* nameInput' nur das erste Element im Array zum Array' name' hinzu. Ich habe die Namensinitialisierung mit einer for-Schleife überarbeitet. –

+0

'* nameInput' bedeutet das erste Zeichen des Arrays nur –

0

@Yinch wies zu Recht darauf hin, dass ich idInput als Wert anstelle eines Arrays behandelte. Schreiben sie als:

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

entfernt den Fehler, sondern fügt nur den ersten Wert nameInput[20]-TESCStudent.name[20]. I entschieden, um die Werte zu TESCStudent wie folgt hinzu:

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 

Die for-Schleife das Problem löst, indem jedes Array Wert TESCStudent.name explizit zuzuweisen. Danke für die Hilfe!

Verwandte Themen