Convert string to integer, Frage...

08/09/2012 23:41 int_Max#1
Hallo,
also, es geht um zwei Codes. Beide sollen einen String in eine Zahl umwandeln.
Um zu zeigen worum es genau geht, hier der funktionierende Code:
PHP Code:
#include <iostream>
#include <string>
#include <sstream>

int main ()
{
    
std::string age;
    
int xh;

    
std::cout << "Enter age for x: ";
    
std::getline (std::cinage);
    
std::stringstream (age) >> x;

    
std::cout << "\nEnter age for y: ";
    
std::getline (std::cinage);
    
std::stringstream (age) >> h;

    
std::cout << "\n\nFinal result: " << h;

    
system ("pause>nul");

    return 
0;

Beispielausgabe bei Ausführung:

Enter age for x: (Eingabe: 7)

Enter age for y: (Eingabe: 8)

Final result: 56


Ich habe versucht das selbe zu erreichen, nur mit anderen Code:
PHP Code:
#include <iostream>
#include <string>

int main ()
{
    
std::string age;
    
int xh;

    
std::cout << "Enter age for x: ";
    
std::getline (std::cinage) >> x;

    
std::cout << "\nEnter age for y: ";
    
std::getline (std::cinage) >> h;

    
std::cout << "\n\nFinal result: " << h;

    
system ("pause>nul");

    return 
0;

Hier die ungewünschte Ausgabe:
Enter age for x: (Eingabe: 7)
//Dann passiert nichts, es wird lediglich auf die nächste Zeile übergesprungen.
//Ich gebe z.B 4 ein und erst dann kommt:
Enter age for y: (Eingabe: 9)
Final result: 36
// Und das ist das Problem! Ich muss oben etwas dazu eingeben und dann wird auch noch was ganz anderes multipliziert anstatt was ich möchte.
08/10/2012 00:42 MrSm!th#2
Warum nutzt du nicht einfach std::cin an Stelle von getline?
std::cin hat den Operator >> überladen und führt automatisch eine formatierte Eingabe durch:

Code:
#include <iostream>
#include <string>
#include <sstream>

int main ()
{
    int x, h;

    std::cout << "Enter age for x: ";
    std::cin >> x;

    std::cout << "\nEnter age for y: ";
    std::cin >> h;

    std::cout << "\n\nFinal result: " << x * h;

    system ("pause>nul");

    return 0;
}
08/10/2012 01:32 SmackJew#3
Code:
#include <iostream>
#include <string>

using namespace std;

int main ()
{
    string age;

    cout<<cin<<endl;

    cout<<getline (cin, age)<<endl;

    return 0;
}
Lass' das mal laufen. Die Ausgaben stimmen überein. Du rufst getline mit cin auf, die Konsole nimmt eine Eingabe, getline gibt allerdings den ersten Parameter als Rückgabewert zurück, in dem Fall cin. Der getline Aufruf wird also zu cin ausgewertet, und dann rufst du operator>> auf das zurückgelieferte cin von getline auf. Deshalb macht die Konsole auch nichts nach der ersten Eingabe, sie wartet auf noch eine.
08/10/2012 07:50 Nightblizard#4
Quote:
Originally Posted by MrSm!th View Post
Warum nutzt du nicht einfach std::cin an Stelle von getline?
std::cin hat den Operator >> überladen und führt automatisch eine formatierte Eingabe durch:

Code:
#include <iostream>
#include <string>
#include <sstream>

int main ()
{
    int x, h;

    std::cout << "Enter age for x: ";
    std::cin >> x;

    std::cout << "\nEnter age for y: ";
    std::cin >> h;

    std::cout << "\n\nFinal result: " << x * h;

    system ("pause>nul");

    return 0;
}
Weil std::cin:: operator>> und std::getline anders funktionieren. std::getline ließt und leert den Stream bis zum nächsten newline (oder einem eigenen Delimeter), std::cin:: operator>> nur bis das Format nicht mehr stimmt.

Ein paar Testwerte in deinem Beispiel:
Enter age for x: 123junk

Enter age for y: <wird übersprungen>

Final result: <whatever>

Nun das selbe mit dem getline Beispiel des TEs:
Enter age for x: 123junk

Enter age for y: 2more junk

Final result: 246


@TE:
Wie SmackJew bereits sagte machst du quasi das hier im zweiten Beispiel:
Code:
std::getline(...);
std::cin >> x;
std::getline(...);
std::cin >> y;