2016-03-19 15 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; 
} 

入力、取得します()私はC++の初心者だ

5 

this is a test 

foobar 

all your base 

class 

pony along 

出力

Case #1: 

Case #2: this is a test 

Case #3: foobar 

Case #4: all your base 

Case #5: class 

行をスキップします。そして、私は逆単語問題を解決しようとしています:https://code.google.com/codejam/contest/351101/dashboard#s=p1

私の出力がこれを与える理由を理解できませんでした。

お願いします。

答えて

0

、あなたのscanf5を食べるが、改行は以下ません。

stringstreamベースの解析を使用し、それがその後の空白を消費するために、または安全のために、getlineを行うことによって数を読み、その後fscanf以上でそれを解析scanfフォーマット文字列内のフォーマットコードの後に​​スペースを追加します。方法は、cstdioiostreamの機能性の混合を最小にする。

+0

次にgets(s)を追加します。ありがとう – Eddie

+0

@ EunMin:Samが言っているように、実際には、古くて安全でないCの 'stdio'関数を使ってはいけません。C++と' iostreamコンストラクト。 'get'で' getline'に固執し、 'scanf'ではなく' stringstream'に基づいて各行の構文解析を行います。 – ShadowRanger

1

gets()は、C++ライブラリ関数ではありません。それはCの関数です。同義語はfreopen()、scanf()です。

混合Cライブラリstdio関数とC++入出力ライブラリ関数の結果は不定です。

すべてのコードをstd::cin,std::cout,std::getline()およびその他のC++入出力ライブラリ関数のみを使用するように変換します。あなたが最初getlineコール(空行である5が食べれたので、)として、行の残りの部分を消費してしまうので、

+0

実際、C++では、 'gets'は存在しません。 27.9.2、表134を参照してください。 – Fanael

関連する問題