В C++ get () пропускает строку

#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

Я не мог понять, почему мой вывод дает это.

Пожалуйста, помогите мне.

2 ответа

Решение

Ваш scanf ест 5, но не символ новой строки, следующий, так что вы в конечном итоге потребляете остаток строки в качестве первого getline вызов (который, так как 5 был съеден, это пустая строка).

Добавьте пробел после кода формата в scanf форматировать строку, чтобы она потом использовала пробел, или, чтобы быть в безопасности, прочитайте число, выполнив getline а затем разобрать его с fscanf или лучше использовать stringstream метод синтаксического анализа, чтобы минимизировать смешивание cstdio а также iostream функциональность.

gets() не является библиотечной функцией C++. Это функция Си. То же самое для freopen(), а также scanf().

Библиотека C смешивания stdio функции и функция библиотеки ввода / вывода C++ приводит к неопределенному поведению.

Конвертировать весь ваш код для использования только std::cin, std::cout, std::getline() и другие функции библиотеки ввода / вывода C++.

Другие вопросы по тегам