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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 31.12.2011, 19:15   #1
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию Как отказаться от const?

И так простенькая задача, на изменение букв, с маленьких на большие.
Я использовал вот такое решение:

Код:
#include <iostream>

using std::cout;
using std::cin;
using std::endl;

int main()
{
	const int arrSize(5);
	char stroka[arrSize];
	

	cout << "Default string:" << endl;
	for (int i = 0; i < arrSize; i++)
	{
		cin >> stroka[i];
		stroka[i] -= 32;
	}

	cout << "Final string:" << endl;
	for (int i = 0; i < arrSize; i++)
		cout << stroka[i] << " ";
	
	cout << endl;
	
	system("pause");
}
Все работает, но мне не нравится привязка к const, а точнее arrSize(5).
По сути char видит строку до '\n', поэтому вопросик такой:
как скажем отказаться от использование константы и в лупах использовать i < '\n' - возможно ли это вообще?
L6go1as вне форума Ответить с цитированием
Старый 31.12.2011, 19:27   #2
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

хм.. а почему не написать
Код:
using namespace std;
???
или будет другой результат ?
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 31.12.2011, 19:51   #3
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

wow... wow...

а юзать cin.getline(...) ?!

теперь по сути вопроса:

можно. только немного по другому.

Код:
char * p = stroka;
for (; *p!=0; p++) 
// *p = ...
onewho вне форума Ответить с цитированием
Старый 31.12.2011, 20:22   #4
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

asmars, ничего не изменится, однако как однажды мне было сказано - лучше отказаться от namespace, ибо в больших проектах могут быть проблемы.

onewho, cin.getline() я сознательно не использовал ибо хотел через char.
Так же не могли бы показать более развернутый пример использования поинтера ?
L6go1as вне форума Ответить с цитированием
Старый 31.12.2011, 20:37   #5
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

Код:
	stroka[i]=0;

	cout << "Final string:" << endl;
	
	for (char *p = stroka; *p ; p++)
		cout << *p << " ";
onewho вне форума Ответить с цитированием
Старый 31.12.2011, 20:42   #6
asmars
Форумчанин
 
Аватар для asmars
 
Регистрация: 28.05.2011
Сообщений: 309
По умолчанию

L6go1as, я по этому и заинтересовался, почему отдельно пишется..
а почему будут проблемы в больших проектах из-за namespace'a ??
Спеши медленно.
asmars вне форума Ответить с цитированием
Старый 31.12.2011, 20:49   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
а почему будут проблемы в больших проектах из-за namespace'a ??
потому что когда вы пишите using namespace <>.
вы по сути отменяете то для чего оно и было создано.
а именно для исключения(уменьшения шанса) конфликта имен.

я на практике натыкался на этот конфликт(изза using namespace <>), потому больше не хочу.

ТС, так а почему бы не применить класс std::string?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 31.12.2011, 20:56   #8
L6go1as
Форумчанин
 
Регистрация: 20.10.2011
Сообщений: 433
По умолчанию

onewho, в вашей интерпретации программа рушится по завершению.
Цитата:
Run-Time Check Failure #2 - Stack around the variable 'stroka' was corrupted.
asmars, о, уже выше ответили.

Пепел Феникса, тут больше не в решении самой задачи дело, а в стремлении отказаться от константы в char ) и придти к лупу с логическим '\n' )

Последний раз редактировалось L6go1as; 31.12.2011 в 21:04.
L6go1as вне форума Ответить с цитированием
Старый 31.12.2011, 21:01   #9
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Можно делать что-то вроде:

Код:
char* ptr=stroka;
    do
    {
        cin >> (*ptr);     (*ptr) -= 32;      ++ptr;
    }while( (*ptr)!='\0' );
Такой цикл будит крутится до тех пор, пока значение char будет неравно нулю-терминатору. А поскольку, он никогда не будет равен нулю-терминатору, то через несколько итераций указатель выйдет за пределы допустимого диапазона массива.

Проблема в том, что istream никогда не возвращает управляющие чары типа '\0', '\n' и тп.
_Bers вне форума Ответить с цитированием
Старый 31.12.2011, 21:02   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

ну надо тогда динамически память выделять
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хочу отказаться от Cpanel - но без нее, думаю, тяжелее будет?! Alar PHP 5 13.11.2010 12:17
ReadOnly и Const Pti44ka Общие вопросы .NET 8 23.04.2010 16:32
Округление чисел, как от него отказаться zzz007 Microsoft Office Excel 5 27.07.2009 09:04
изменение const zander Microsoft Office Excel 1 13.05.2009 09:12
БД в Delphi - как отказаться от BDE? JoanM БД в Delphi 21 09.01.2008 03:40