Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.12.2015, 09:24   #1
JokerWCC
Пользователь
 
Регистрация: 10.10.2010
Сообщений: 18
По умолчанию Цикл отказывается работать

Программа должна зацикленно предлагать пользователю ввести денежную сумму ($1 234 567 89.99) типа string и перевести ее в long double... программка переводит сумму, но после первой итерации вылетает ошибка R6010 - abort () has been called. Пожалуйста скажите где ошибка и как исправить. Собственно сама программа:

Код:
#include <iostream>
#include <iomanip>
#include <string>
 
using namespace std;
 
class money
{
private:
    static const int MAX = 20;
    char mnosign[MAX];
public:
    long double swaplines (string);
};
 
long double money::swaplines (string m)
{
    int l = m.length ();
    int count = 0;
    for (int j = 0; j < l; j++)
    {
        switch (m.at(j))
        {
        case '1': mnosign[count++] = m.at(j); break; 
        case '2': mnosign[count++] = m.at(j); break;
        case '3': mnosign[count++] = m.at(j); break;
        case '4': mnosign[count++] = m.at(j); break;
        case '5': mnosign[count++] = m.at(j); break;
        case '6': mnosign[count++] = m.at(j); break;
        case '7': mnosign[count++] = m.at(j); break;
        case '8': mnosign[count++] = m.at(j); break;
        case '9': mnosign[count++] = m.at(j); break;
        case '.': mnosign[count++] = m.at(j); break;
        }
    }
    mnosign[count] = 0;
    long double r = stold(mnosign);
    return r;
}
 
int main ()
{
    string s;
    money end;
    char answ;
    do
    {
        cout << "Enter money:\n";
        getline (cin, s);
        cout << "You entered: " << setiosflags (ios::fixed) << setiosflags (ios::showpoint)
            << setprecision (2) << setw (15) << end.swaplines(s);
        cout << "\nOne more time (y/n)??? "; cin >> answ;
    }
    while (answ != 'n');
    cout << endl;
    return 0;
}
JokerWCC вне форума Ответить с цитированием
Старый 21.12.2015, 09:31   #2
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

1. Проверь фактическую длину строки.
2. Использование внешнего буфера - источник проблем с потоками.
taras-proger вне форума Ответить с цитированием
Старый 21.12.2015, 09:42   #3
JokerWCC
Пользователь
 
Регистрация: 10.10.2010
Сообщений: 18
По умолчанию

И что мне делать?
P.S: только что пошагово протестил программу - цикл в порядке (как и должно быть), но строку getline (cin, s) на втором цикле перескакивает и вылетает ошибка... В чем же проблема?? допустим программа

Код:
#include <iostream>
#include <string>

using namespace std;

int main ()
{
	string s;
	for (int j = 0; j < 100; j++)
		getline (cin, s);
	return 0;
}
работает нормально. бред какой-то
JokerWCC вне форума Ответить с цитированием
Старый 21.12.2015, 12:30   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Напиши в своем коде так:
В long double money::swaplines (string m)
Код:
	if(count)   return stold(mnosign);
	else    return -1;
И вот так в цикле ввода:
Код:
		cin >> answ;
		cin.ignore();
    }
    while (answ != 'n');
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.12.2015, 13:40   #5
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

После нажатия Enter в буфере cin помещается '\n', когда вы делаете cin >> char один симвод извлекается, а перевод строки остаётся в потоке и используется на следующей итерации. getline извлекает и выбрасывает из потока перевод строки. http://ru.cppreference.com/w/cpp/str...string/getline (хороший справочник, но не всё переведено на русский, если есть возможность, то штудируй английскую версию). Рекомендую считывать ответ на вопрос о продолжении в строку с дальнейшей проверкой её в while(string != "n").
Цитата:
но строку getline (cin, s) на втором цикле перескакивает и вылетает ошибка..
Не перескакивает. Это потому что cout << "ksfjkdf" не обязан мгновенно печатать, а может подождать заполнения своего буфера или некторых других условий (в том числе использование istream:: operator >>), а так как вылетает исключение, то этого вообще не происходит. Если хотите не откладывать печать на экран, то необходимо подталкивать к этому cout: cout << "dfsf" << endl, cout << "dfdf" << flush или спользовать cerr.
220Volt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Монитор отказывается работать. Анна-22 Компьютерное железо 6 28.04.2013 22:23
исходник unwand на с ++ отказывается работать pala4ilo Visual C++ 0 11.05.2012 21:02
Компилируется, но работать отказывается! kta87 Общие вопросы Delphi 4 31.10.2011 15:40
JQuery Corner отказывается работать Linel JavaScript, Ajax 5 05.07.2010 10:07
setTimeout отказывается работать Deight JavaScript, Ajax 17 29.01.2009 20:29