2016-03-19 12 views
-5
#include <bits/stdc++.h> 

using namespace std; 

vector<string> split(string str, char delimiter) 
{ 
    vector<string> internal; 
    stringstream ss(str); 
    string tok; 

    while(getline(ss, tok, delimiter)) 
    { 
    internal.push_back(tok); 
    } 

    return internal; 
} 

int main() 
{ 
    freopen("in", "r", stdin); 
    freopen("out", "w", stdout); 
    int tt; 
    scanf("%d", &tt); 
    for (int qq = 1; qq <= tt; qq++) { 
    printf("Case #%d: ", qq); 

    char s[1234]; 

    stringstream ss; 
    gets(s); 
    for(int j = 0; s[j] ; j++) ss << s[j]; 

    vector<string> w = split(ss.str(), ' ');  
    for(int i = 0; i < w.size(); ++i) 
    { 
     printf("%s ", w[i].c_str()); 
    } 
    printf("\n"); 
    } 
    return 0; 
} 

EingangIn C++, gets() überspringt eine Zeile

5 

this is a test 

foobar 

all your base 

class 

pony along 

Ausgabe

Case #1: 

Case #2: this is a test 

Case #3: foobar 

Case #4: all your base 

Case #5: class 

Ich bin ein C++ Anfänger. Und ich versuche, Reverse-Wort Problem zu lösen: https://code.google.com/codejam/contest/351101/dashboard#s=p1

Ich konnte nicht herausfinden, warum meine Ausgabe dies gibt.

Bitte helfen Sie mir.

Antwort

0

Ihre scanf isst die 5, aber nicht die Neue-Zeile folgen, so dass Sie den Rest der Zeile als ersten getline Anruf raubend am Ende (die, da die 5 gegessen wurde, eine leere Zeile ist).

im scanf Format-String ein Leerzeichen nach dem Format Code hinzufügen, um es den Leer danach zu machen verbrauchen, oder um sicher zu sein, die Anzahl von einem getline tun und dann analysieren sie mit fscanf oder besser lesen, eine stringstream basierten Analyse verwenden Methode zur Minimierung der Mischung von cstdio und iostream Funktionalität.

+0

dann Hinzufügen von gets (s); außerhalb der for-Schleife dieses Problem .. Dank – Eddie

+0

@EunMin wird fix: Es kann, aber wirklich, wie Sam sagt, sollten Sie nicht die alte, unsichere C 'verwenden gar stdio' Funktionen, lassen Sie sie mit C allein Mischen ++' Iostream' Konstrukte. Bleiben Sie bei 'getline' über' gets' und verwenden Sie 'stringstream' basierend auf der Analyse jeder Zeile und nicht' scanf'. – ShadowRanger

1

gets() ist kein C++ Library-Funktion. Es ist eine C-Funktion. Dito für freopen() und scanf().

Mischen von C-Bibliothek stdio Funktionen und C++ Eingabe/Ausgabe-Bibliotheksfunktion führt zu unspezifiziertem Verhalten.

Konvertieren Sie alle Ihre Code zu verwenden, nur std::cin, std::cout, std::getline() und andere C++ Input/Output-Bibliotheksfunktionen.

+0

In C++ existiert 'gets' eigentlich gar nicht. Siehe 27.9.2, Tabelle 134. – Fanael