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

入力

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 

私はC++の初心者です。そして、逆単語の問題を解決しようとしています: https://code.google.com/codejam/contest/351101/dashboard#s=p1

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

私を助けてください。

4

2 に答える 2

1

gets()C++ ライブラリ関数ではありません。C関数です。freopen() と () についても同様ですscanf

stdioC ライブラリ関数と C++ 入出力ライブラリ関数を混在させると、動作が規定されていません。

すべてのコードをstd::cinstd::coutstd::getline()およびその他の C++ 入力/出力ライブラリ関数のみを使用するように変換します。

于 2016-03-19T01:32:38.273 に答える
0

あなたは を食べますが、次の改行はscanf食べません。そのため、行の残りを最初の呼び出しとして消費することになります (これは、が食べられたので空行です)。5getline5

フォーマット文字列のフォーマットコードの後に​​スペースを追加して、scanf後で空白を消費するようにするか、安全のために、 agetlineを実行して数値を読み取ってから、fscanfまたはより適切に解析し、ベースの解析方法を使用してと機能stringstreamの混合を最小限に抑えます。cstdioiostream

于 2016-03-19T01:35:16.183 に答える