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

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

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2012, 20:31   #1
Styks
Пользователь
 
Регистрация: 22.03.2009
Сообщений: 12
По умолчанию tcscpy_s.inl buffer is too small

Учу С++ по книжке, делаю калькулятор усложненный с скобками и прочим:
Код:
// Calc.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <cstdlib>
#include <cctype>
#include <conio.h>
#include <cstring>

	using namespace std;
const int MAX(80);
void eatspaces(char* str);
char* extract(char* str,int& index);
double number(char* str,int& index);
double expr(char* str);
double term(char* str, int& index);

int _tmain(int argc, _TCHAR* argv[])
{
	char buffer[MAX]={0};
	cout<<"\nHELLO!WELCOME TO CALC!\nInput expression please\n>";
	for(;;)
	{cout<<">";
		cin.getline(buffer,sizeof buffer);
		eatspaces(buffer);
		if(!buffer[0])
			return 0;
		cout<<"\n\n\nRESULT= "<<expr(buffer)<<endl<<endl<<"Press ENTER for new expression\n";
	_getch();
	}

}

void eatspaces(char* str)
{
	int i(0);
	int j(0);

	while((*(str+i)=*(str+j++))!='\0')
		if(*(str+i)!=' ')
			i++;
	return;
}

double expr(char* str)
{
	double value(0.0);
	int index(0);

	value=term(str, index);
	for(;;)
	{
		switch(*(str+index++))
		{
			case '\0':
				return value;
			case '+':
				value+=term(str,index);
				break;
			case '-':
				value-=term(str,index);
				break;
			default:
				cout<<"\nERROR!\n";
				exit(1);
				
		}
	}
}
double term(char* str,int& index)
{
	double value(0.0);
	value=number(str,index);

	while(true)
	{
		if(*(str+index)=='*')
			value*=number(str,++index);
		else if(*(str+index)=='/')
			value/=number(str,++index);
		else
			break;
	}
	return value;
}
double number(char* str,int& index)
{double value(0.0);
	if(*(str+index)=='(')
	{
		char* psubstr=NULL;
		psubstr=extract(str,++index);
		value=expr(psubstr);
		delete[]psubstr;
		return value;
	}
	
	if(!isdigit(*(str+index)))
	{
		cout<<"ERROR"<<endl;
		exit(1);
	}
	while(isdigit(*(str+index)))
		value=10*value+(*(str+index++)-'0');
	if(*(str+index)!='.')
		return value;
	double factor(1.0);
	while(isdigit(*(str+(++index))))
	{
		factor*=0.1;
		value=value+(*(str+index)-'0')*factor;
	}
	return value;

}

char* extract(char* str,int& index)
{
	char buffer[MAX-1];
	char* pstr(0); 
	int numL(0);
	int bufindex(index);

	do
	{
		buffer[index-bufindex]=*(str+index);
		switch(buffer[index-bufindex])
			{
			case ')':
				if(0==numL)
				{
					buffer[index-bufindex]='\0]';
					++index;
					pstr=new char[index-bufindex];
					if(!pstr)
					{
						cout<<"Memory error";
						exit(1);
					}
					strcpy_s(pstr,index-bufindex,buffer);
					return pstr;
					
				}
				else
					numL--;
				break;
			case '(':
				numL++;
				break;
		}
	
	}while(*(str+index++)!='\0');
	cout<<"ERROR of input";
	_getch();
	exit(1);
}
выдает ошибку
Debug Assertion Failed!
Program:................
File: f:\dd\vctools\crt_bld\self_x86\crt\ src\tcscpy_s.inl
Line: 30
Expression: (L "Buffer is too small" && 0)

Понимаю, что проблема с буфером и один меньше другого, но как исправить...Вроде все верно
Styks вне форума Ответить с цитированием
Старый 15.10.2012, 21:48   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Код:
buffer[index-bufindex]='\0]';
Что вы хотели от квадратной скобки здесь?
p51x вне форума Ответить с цитированием
Старый 15.10.2012, 22:29   #3
Styks
Пользователь
 
Регистрация: 22.03.2009
Сообщений: 12
По умолчанию

От этой скобки...я бы хотел, чтобы ее не было..) Спасибо, помогло. Странно, что компилятор не приметил такую опечатку...Хотя, нет не странно, она же в кавычках была.
Styks вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
small basic Muse Помощь студентам 10 08.12.2011 18:32
small basic АннаЛонг Помощь студентам 1 30.11.2011 13:56
Драйвер для получения доступа к depth buffer IvanS Помощь студентам 0 29.07.2011 00:50
RFB (Remote Frame Buffer Protocol) stalsoft Помощь студентам 0 09.06.2011 15:37
[DelphiX - d3d9] Vertex Buffer alexprey Мультимедиа в Delphi 5 16.06.2010 18:02