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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2012, 14:07   #1
millepetrozza
Пользователь
 
Регистрация: 22.09.2012
Сообщений: 33
По умолчанию Удаление элемента строки

Есть код, который удаляет удаляет из строки текст в [...](пока работает только для одних квадратных скобок):
Код:
#include "stdafx.h"
#include "conio.h"
#include "stdlib.h" 

int main()
{
	int l,i,j,n,k;
	char *st;
	puts("Enter string's length");
	scanf("%d", &l);
	st=(char *)malloc(l);
	fflush(stdin);
	puts("Enter string");
	gets(st);
	puts(st);
	for(i=0;*(st+i);i++)
	{	
		if(*(st+i)=='[')
		{	
			for(j=i;*(st+j);j++)
			{	
				if(*(st+j)==']')
				{
					for(n=i;n<j;n++)
					{
						*(st+n)=*(st+j+1);
					}
					for(k=n-1;*(st+k);k++)
					{
						*(st+k)=NULL;
					}
				}
			}
		}
	}
		puts(st);
	getch();
}
Очевидно, что код нерационален, но пока не приходит в голову, как его оптимизировать(особенно что касается числа переменных в нём).
millepetrozza вне форума Ответить с цитированием
Старый 20.11.2012, 18:33   #2
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

Код:
char* a, *b;
for(a = b = st; *a; *a = *b) {
     if(*a++ == '[') {
         while(*b && *b != ']')
             *b++;
         if(! *b)
              break;
     } else
          *b++;
}
Nuklon вне форума Ответить с цитированием
Старый 20.11.2012, 19:29   #3
millepetrozza
Пользователь
 
Регистрация: 22.09.2012
Сообщений: 33
По умолчанию

Немного не ясно что происходит в некоторых местах:
Код:
char* a, *b;
for(a = b = st; *a; *a = *b) {
     if(*a++ == '[') {
         while(*b && *b != ']') // Что здесь значит первое условие
             *b++;
         if(! *b)                    // Что означает это условие
              break;
     } else
          *b++;
}
millepetrozza вне форума Ответить с цитированием
Старый 20.11.2012, 20:35   #4
Nuklon
Форумчанин
 
Аватар для Nuklon
 
Регистрация: 05.04.2012
Сообщений: 134
По умолчанию

Код:
char* a, *b;
for(a = b = st; *a; *a = *b) { // при каждой итерации идёт присваивание
     if(*a++ == '[') {
         while(*b && *b != ']') // инкрементируем до завершающего символа
             *b++;
         if(! *b)// страховка на то что может и не быть завершающего символа ']'
              break;
     } else // если нет условия указатель синхронно итерируется с PTR(a)
          *b++;  
}
Алгоритм удаления лишних символов однопроходный, вот в чём сущность его.
Nuklon вне форума Ответить с цитированием
Старый 20.11.2012, 21:05   #5
millepetrozza
Пользователь
 
Регистрация: 22.09.2012
Сообщений: 33
По умолчанию

Честно говоря ещё маловато опыта, поэтому туго соображаю, сначала были соображения, что

Код:
char* a, *b;
for(a = b = st; *a; *a = *b) {
     if(*a++ == '[') {
         while(*b && *b != ']') // Инкрементирование, пока строка не кончится, или не найдётся завершающий символ.
             *b++;
         if(! *b)                    
              break;
     } else
          *b++;
}
но сейчас что-то я вообще запутался. Можно ещё раз немного подробней объяснить первое условие цикла while и условие цикла for, если не трудно?
millepetrozza вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление элемента массива LiuLiuJons Общие вопросы C/C++ 6 07.03.2012 23:38
удаление элемента из массива Dmitry73 Помощь студентам 3 02.12.2010 09:10
удаление элемента массива Studentka_iz_ZP Общие вопросы C/C++ 2 02.10.2010 13:55
удаление элемента из списка aurora_87 Общие вопросы C/C++ 1 18.06.2009 14:02
Удаление элемента массива chiffa Общие вопросы Delphi 1 03.01.2008 19:24