Разница между определением строки в коде и вводом с консоли - PullRequest
0 голосов
/ 10 февраля 2012

Я работаю над проектом для класса структур данных. Цель состоит в том, чтобы использовать дерево, чтобы выяснить, могут ли метафорические карлики платить метафорические налоги метафорическими алмазами. Входные данные даны в виде строки в формате «3 1 2 3 3 1 2 3», что подразумевает 3 бриллианта стоимостью 1 2 3 и 3 налога стоимостью 1 2 3.

Проблема, с которой я столкнулся, связана не с реализацией дерева, а с обработкой ввода таким образом, чтобы я мог вставить его в дерево и, в частности: когда я вводю значения в код непосредственно при тестировании дает правильный вывод, но при использовании cin вывод сталкивается с несколькими проблемами.

Со следующим кодом:

string str;
str = "5 1 2 3 4 5 5 1 2 3 4 5";


str.erase(remove_if(str.begin(), str.end(), ::isspace), str.end());
char ch[str.size()];
strcpy(ch, str.c_str());

int numDiamonds = ch[0] - '0';
cout<<numDiamonds<<" diamonds"<<endl;

int counter = 1;

for(int i = 1; i < numDiamonds+1; ++i){
    int out = ch[i] - '0';
    cout<<out;
    cout<<" ";
    ++counter;
}

cout<<endl;

int numTaxes = ch[numDiamonds+1] - '0';

cout<<numTaxes<<" taxes"<<endl;
for(int i = counter+1; i < str.size(); ++i){
    int out = ch[i] - '0';
    cout<<out;
    cout<<" ";
}
cout<<endl;
}

мой вывод выглядит правильно и выглядит следующим образом:

5 diamonds
1 2 3 4 5
5 taxes
1 2 3 4 5

но когда я меняю "str = 5 1 ..." на "cin >> str", мой вывод выглядит беспорядочным и выглядит следующим образом.

5 diamonds
-48 -48 -48 -48 -48
-20 taxes

1 diamonds
-48
-48 taxes

2 diamonds
-48 -48
-48 taxes

3 diamonds
-48 -48 -48
-48 taxes

4 diamonds
-48 -48 -48 -48
-48 taxes

5 diamonds
-48 -48 -48 -48 -48
-20 taxes

5 diamonds
-48 -48 -48 -48 -48
-20 taxes

1 diamonds
-48
-48 taxes

2 diamonds
-48 -48
-48 taxes

3 diamonds
-48 -48 -48
-48 taxes

4 diamonds
-48 -48 -48 -48
-48 taxes

5 diamonds
-48 -48 -48 -48 -48
-20 taxes

Никакое гугление не помогло решить мою проблему, поэтому я обращаю вас, ребята. Есть ли объяснение, почему cin в строку имеет другое поведение, чем определение строки в коде?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 10 февраля 2012

Это потому, что ввод заканчивается, когда он встречается с пробелом, то есть он читает только первое число. Вместо этого используйте cin.getline().

Точная строка ввода будет выглядеть следующим образом: getline(cin, str), потому что вы используете std::string, в противном случае cin.getline() тоже сделал бы эту работу.

1 голос
/ 10 февраля 2012

Попробуйте использовать std :: getline (cin, str).

0 голосов
/ 10 февраля 2012

cin просто берет следующий пробельный символ.

Вы можете использовать cin.getline, но лучшей альтернативой, видя, для чего вы его используете, является цикл для cin длякаждое целое число.

Таким образом, вы можете сделать:

vector<int> input;

int x;
while (cin.good()) {
    cin >> x;
    input.push_back(x);
}

cin.good() просто проверяет, является ли поток все еще ... хорошо, хорошо.Если есть проблема с потоком (например, если вы доберетесь до конца потока), он возвращает 0. Это хороший способ извлечь элементы из stdin, если вы знаете его формат, и обычно это то, как вы читаете из stdinПроблемы с ICPC / topcoder.Делает вещи намного проще, вы не согласны?:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...