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

InputВ 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 

Я новичок C++. И я пытаюсь решить проблему обратного слова: https://code.google.com/codejam/contest/351101/dashboard#s=p1

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

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

ответ

0

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

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

+0

, затем добавление получает (-ы); вне цикла for будет исправлять эту проблему .. спасибо – Eddie

+0

@EunMin: Возможно, но, как говорит Сэм, вы не должны использовать старые, небезопасные функции C 'stdio' вообще, не говоря уже о смешивании их с C++' iostream'. Придерживайтесь 'getline' над' gets' и используйте '' строковый анализ 'stringstream' для каждой строки, а не' scanf'. – ShadowRanger

1

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

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

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

+0

Собственно, на C++ 'get' даже не существует. См. 27.9.2, таблица 134. – Fanael

Смежные вопросы