2017-04-12 3 views
-1

Ich habe einen Code, den ich versuche zu lernen, in C++ zu analysieren. Ich habe alles verstanden, was ich gemacht habe, aber ich verstehe nicht, wie man mit Leuten wie atoi(), atof(), strtod() arbeitet. Ich weiß, was es tun soll, aber ich verstehe nicht, warum der Compiler es nicht mag. Mein Fokus auf den Fehler ist "scores [line_count] = strtod (score);"Wie funktioniert die Konvertierungsfunktion?

#include <iostream> 
#include <fstream> 
#include <string> 
#include <stdlib.h> 
#include <iomanip> 

using namespace std; 

int readScores(string inputFile, string name[], float scores[], int  array_size) 
{ 
//delcare variables 
ifstream infile; 
int line_count = 0; 
string line; 
string named; 
float score; 
char character; 
int word_index; 
string names[array_size]; 


// open input file 
infile.open(inputFile); 

//Check if file opens succesfully. 
if(infile.fail()) 
{ 
    cout << "File cannot open!!" << endl; 
    return -1; 
} 

while(getline(infile, line)) 
{ 
    cout << line << endl; 
    // PARSING GOES HERE 

    word_index = 0; 

    for(int i=0; i < (int)line.length(); i++) 
    { 
     character = line[i]; 

     if (character == ',') 
     { 
      names[line_count] = named; 
      named = ""; 
      word_index++; 
     } 
     else 
     { 
      if(word_index == 0) 
      { 
       named += character; 

      } 
      else if (word_index == 1) 
      { 
       score += character; 
       cout << character << " " << endl; 
      } 
     } 

    } 
scores[line_count] = strtod (score); 



    line_count++; 

} 

//close file 
infile.close(); 

//return line count 
return line_count; 
cout << line_count << endl; 
} 

int main(void) 
{ 
int array_size = 50; 
string inputFile = "Test.txt"; 
string name [array_size]; 
float scores [array_size]; 


readScores(inputFile, name, scores, array_size); 
} 
+0

"Der Compiler mag es nicht" ist keine sehr hilfreiche Beschreibung. – John3136

+0

Es gibt mir einen Fehler. Es heißt: "Kann float nicht in const char * für Argument 1 konvertieren." – Robbie

+0

@Robbie also warum ist es nicht hilfreich? Sie übergeben 'float' anstelle von' char * '! –

Antwort

0

Die Funktion strtod() die Form

double strtod (const char* str, char** endptr); 

Aber du es nur die Zeichenfolge geben.

Wie Sie sehen können, braucht es zwei Parameter, die Zeichenfolge, die Sie in ein Doppel konvertieren möchten, und ein "Endptr". Die endptr beschrieben here als

Verweis auf ein bereits zugewiesene Objekt vom Typ char *, dessen Wert gesetzt wird durch> die Funktion auf das nächste Zeichen in str nach dem Zahlenwert. Dieser Parameter kann auch ein Nullzeiger sein. In diesem Fall wird er nicht verwendet.

Sie müssen also einen Zeichenzeiger deklarieren, um das nächste Zeichen nach dem Dezimaltrennzeichen zu speichern, auch wenn es keins gibt. Auf diese Weise können Sie mehrere Doppelpunkte einer einzelnen Zeichenfolge ziehen, ähnlich wie bei einem Tokenizer.

char * endPtr; 
scores[line_count] = strtod(score, &endPtr); 

bearbeiten

Als Alex Lop wies darauf hin, Sie werden nicht einmal einen String übergeben strtod, vorbei sind Sie einen Schwimmer. Es sieht so aus, als würdest du den Float zu einem Double machen wollen?

+0

Okay ... sag ich ändere es in atof (Ergebnis) ... Ich bekomme immer noch den gleichen Fehler. double afof (const char * _nptr) – Robbie

+1

Das ist, weil atof() eine Zeichenfolge in einen Float konvertiert, und Sie würden immer noch eine Float übergeben. Mein Vorschlag wäre, die Manpages vor der Verwendung von Funktionen zu betrachten, damit Sie genau wissen, was sie tun und welche Parameter sie übergeben müssen. – rhysvo

0

Natürlich mag der Compiler es nicht. Bitte lesen Sie die Beschreibung von strtod.

doppeltes strtod (const char * str, char ** endptr);

Konvertieren string zu double.

Analysiert den C-String str seinen Inhalt als schwimmender Punktnummer Interpretieren (entsprechend der aktuellen locale) und gibt seinen Wert als double. Wenn endptr kein null Zeiger ist, setzt die Funktion auch den Wert endptr, um auf das erste Zeichen nach der Zahl zu zeigen.

Die Funktion verwirft zunächst so viele Leerzeichen (wie in ispace), bis das erste Nicht-Leerzeichen gefunden wird. Ausgehend von diesem Zeichen werden dann so viele Zeichen wie möglich, die nach einer Syntax gültig sind, die der Fließkomma-Literale ähnelt (siehe unten), und sie als Zahlenwert interpretiert. Ein Zeiger auf den Rest der Zeichenfolge nach dem letzten gültigen Zeichen ist in dem Objekt gespeichert, auf das von endptr verwiesen wird.

Und in Ihrem Code übergeben Sie strtod nur einen Parameter, die float vom Typ ist und speichern Sie das zurückgegebene Ergebnis von double in ein Array von float s. Wenn Sie den Wert von float von einer Variablen zu einem anderen verschieben möchten, brauchen Sie keine „convertion“ -Funktion:

scores[line_count] = score; 

HINWEIS: habe ich nicht wirklich Ihren Code überprüfen, wie Sie speziell gefragt scores[line_count] = strtod (score);. Aber nachdem ich sah, wie Sie score ändern, sollte es vielleicht string und nicht float gewesen sein. Wenn ja, dann ist es der andere Punkt zu beheben.

Verwandte Themen