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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.04.2011, 17:04   #1
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию C++ выход за пределы строки (char)

Перевод строки вида $1,234,567,890,123.99 в число (double). Все вроде бы работает правильно, но побороть возможность выхода за пределы массива что-то не получается (т.е. можно ввести, например, 1111111111111111111,1111111 и произойдет что-нибудь нехорошое). В книге написано об использовании setw() в таких случаях, но что-то результата нет. Задание из Лафоре, глава про массивы и строки.

Код:
#include <iostream>
#include <iomanip> 
#include <conio.h>
#include <cstring>
#include <string>
#include <cstdlib>
using namespace std;

class money
{
private:
	double n;
public:
	double mstold(char strm[])
	{
		string s="0123456789.";
		char retstr[20];
		for(int i=0, j=0; i<strlen(strm); i++)
			if( s.find_first_of(strm[i]) < s.size() )     //если символ число или точка
				retstr[j++]=strm[i];
		n = atof(retstr);
		return n;
	}
};


int main()
{
	money m1;
	char strm[20], yn;
	do
	{
		cout << "Enter: ";
		cin >> setw(22) >> strm;
		cout << "You entered: $" << setiosflags(ios::fixed) << setiosflags(ios::showpoint) << setprecision(2) << m1.mstold(strm);
		cout << "\nContinue?(y/n)"; cin >> yn;
	} while(yn!='n');

	return 0;
}
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 20.04.2011 в 17:20.
Alex11223 вне форума Ответить с цитированием
Старый 20.04.2011, 19:40   #2
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

setw() это манипулятор вывода, он обрубает только видимые на экране числа.
про проверку ввода:
cin.getline(str,20); вот и всё

кстати по-поводу перевода - есть же atof()

Последний раз редактировалось onewho; 20.04.2011 в 19:54.
onewho вне форума Ответить с цитированием
Старый 20.04.2011, 19:59   #3
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну я и сделал с помощью atof, или что имелось в виду? Что можно было сразу atof(strm) ?)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 20.04.2011, 20:26   #4
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

эм... ну да
n = atof(str);
onewho вне форума Ответить с цитированием
Старый 20.04.2011, 20:27   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Вроде пробовал так вначале, но что-то неправильно получалось.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# - Вывод строки System.Char[] вместо нужного результата Lastsummer Помощь студентам 3 02.02.2011 22:55
C++ - выход за пределы массива kefir Помощь студентам 5 12.06.2010 14:09
Перегрузка оператора (принять номер строки и строку char) delias Общие вопросы C/C++ 0 06.01.2010 15:40
Как определить выход курсора за пределы объекта Image Дамир Общие вопросы Delphi 7 29.03.2009 21:59
Длина строки в си : char string[255] Mixasik Помощь студентам 1 26.11.2008 20:33