gcj — в C ++ gets () пропускает строку

#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

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

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

-5

Решение

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

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

0

Другие решения

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

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

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

1

По вопросам рекламы [email protected]