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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2011, 19:58   #1
magrif
Новичок
Джуниор
 
Регистрация: 01.11.2011
Сообщений: 7
По умолчанию Обработка символьного массива с пом. указателей

while(*st)
{
if(*st == symb)
{
while(*p_st != *st)
{
*p_st=*(p_st+1);
*p_st--;
}
*(st+1)=*st;
*st = *(st+2);
}
*st++;
}

Вводим символ и строку с клавиатуры. Ищем такие же символы в строке и надо рядом с ними дописать этот же символ. Напирммер ввели символ Ш и слово ШАЛАШ. Должно получиться ШШАЛАШШ.
Код набросал. C++
magrif вне форума Ответить с цитированием
Старый 01.11.2011, 22:32   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

А получится - ШШЛАШШfr;klh58471ttr4p
Массив - тип данных фиксированного размера, в него без танцев с бубном нельзя "вставить" дополнительные буквы.
Но можно читать массив по одному символу, а на печать выводить один или два.
Abstraction вне форума Ответить с цитированием
Старый 01.11.2011, 22:40   #3
magrif
Новичок
Джуниор
 
Регистрация: 01.11.2011
Сообщений: 7
По умолчанию

str = new char(strlen(tmp)+count+1);
strcpy_s(str, strlen(tmp)+1, tmp);

tmp[80]; сам массив куда ввели предложение
посчитали количество count вхождений в него символа + нулевой байт. В указатель разименуем блок памяти чтоб решить эту задачу.
Так что без бубнов обойдёмся
Код:
	while(*st != *p_st)
	{
		if(*st == symb)
		{
			while(*p_st != *st)
			{
			*(p_st+1)=*p_st;
			*p_st--;
			}
			*(p_st+1) = symb;
		}
		*st++;
	}
получается ШАЛАШШ

Последний раз редактировалось magrif; 01.11.2011 в 22:54.
magrif вне форума Ответить с цитированием
Старый 01.11.2011, 22:57   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Решение за два прохода? Ну ладно, а что хотите-то?
В изначальном коде, кто такие st и p_st?
Код:
//Пока st не дошёл до конца строки
while(*st)
{
  //Если st указывает на символ symb
  if(*st == symb)
  {
    //Пока символ под p_st не равен символу под st (symb)
    while(*p_st != *st)
    {
      //В символ под p_st записать символ на следующей позиции
      *p_st=*(p_st+1);
      //Получить текущий символ под p_st (?) и перевести p_st на предыдущий
      *p_st--;
    }
    //st и p_st теперь указывают на одинаковые символы, symb
    //Также, все символы от следующего за p_st до начальной позиции p_st забиты одним и тем же значением
    //В символ, следующий за символом под st, занести symb
    *(st+1)=*st;
    //В символ под st занести символ через один от позиции st (опасно, возможен вылет за пределы буфера)
    *st = *(st+2);
  }
  //Получить текущий символ под st (нафига?) и перевести st на следующий символ
  *st++;
}
Abstraction вне форума Ответить с цитированием
Старый 01.11.2011, 23:00   #5
magrif
Новичок
Джуниор
 
Регистрация: 01.11.2011
Сообщений: 7
По умолчанию

st и p_st это указатели
*st указывает на 1-й символ в массиве, а p_st равен нулевому байту
magrif вне форума Ответить с цитированием
Старый 01.11.2011, 23:01   #6
magrif
Новичок
Джуниор
 
Регистрация: 01.11.2011
Сообщений: 7
По умолчанию

Код:
#include "work_4.h"

int main()
{
	char tmp[80];
	char symb;
	int count(0);
	cout << "enter string=";		//Вводим строку
	cin.getline(tmp, 80);
	cout << "enter symbol=";		//Вводим символ
	cin >> symb;		
	cout << endl;		
	cout << endl;
		if(isdigit(tmp[0]) != 0)			//Если  первый символ - число, вернуть функции значение 0
			return 0;
	char *str = new char[strlen(tmp)+1];	//Освободить область памяти, равную длине введённой строки + нулевой байт
	strcpy_s(str, strlen(tmp)+1, tmp);		//Скопировать в эту область памяти введённую строку
	char* st = str; //Указатель на 0 символ
	while(*st)		//Считаем количесвто вхождений символа в строку
	{
		if(*st == symb)
		    {
			count++;
			}
		st++;
	}
	cout << "count =" << count << endl;
	delete [] str;
	str = new char(strlen(tmp)+count+1);
	strcpy_s(str, strlen(tmp)+1, tmp);
	st = str;
	char *p_st = str+strlen(tmp);   //Указатель на нулевой байт

	while(*st != *p_st)
	{
		if(*st == symb)
		{
			while(*p_st != *st)
			{
			*(p_st+1)=*p_st;
			*p_st--;
			}
			*(p_st+1) = symb;
		}
		*st++;
	}
	cout << "new string = " << str << endl;
	return 0;
}
Вот весь код программы если надо. Последний алгоритм не могу как раз сделать
magrif вне форума Ответить с цитированием
Старый 01.11.2011, 23:08   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Заведите две строки - исходная (по которой пойдёт курсор str) и результирующая, удлиннённая (по которой пойдёт курсор rec). И тупо, пока не кончилась первая строка, один символ переписывайте всегда, а если символ - требуемый, то в результирующую строку дописывайте ещё один.
Abstraction вне форума Ответить с цитированием
Старый 01.11.2011, 23:11   #8
magrif
Новичок
Джуниор
 
Регистрация: 01.11.2011
Сообщений: 7
По умолчанию

В том то и подковырка, что дополнительные массивы и блоки памяти низя создавать. Что Бог дал, то и юзай.
magrif вне форума Ответить с цитированием
Старый 02.11.2011, 00:09   #9
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Долго думал.
Код:
char tmp[80];
Код:
char *str = new char[strlen(tmp)+1];
Код:
str = new char(strlen(tmp)+count+1);
Вы и так создаёте на один массив больше чем нужно. Какое именно граничное условие?
Да можно обойтись одним массивом, просто это ненужная сложность и при неизменном порядке расхода памяти O(N) ограничение выглядит довольно странно.
Скажем, так: пусть есть удлинённый массив, тогда поставить один курсор на конец текста (на '\0'), второй - на конец самого массива. И задом наперёд, переносить символ с первого курсора на второй, сдвигать второй, после чего при нужном символе под первым курсором повторять перенос и только потом сдвигать первый курсор. И так пока первый курсор не сравняется со вторым (курсоры, не символы под ними!).
Abstraction вне форума Ответить с цитированием
Старый 02.11.2011, 07:11   #10
magrif
Новичок
Джуниор
 
Регистрация: 01.11.2011
Сообщений: 7
По умолчанию

Разрешен один массив - тмп 80 и область памяти. И с этой областью нужно работать.
да да да, как сравнить курсоры, а не символы?

Последний раз редактировалось magrif; 02.11.2011 в 07:13.
magrif вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка очистки памяти символьного массива BLOCK_TYPE_IS_VALID(pHead->nBlockUse) dasvex Помощь студентам 2 08.08.2011 02:05
С. Вывод символьного массива - результат удручающе не понятен Алексей Денисов Помощь студентам 5 05.07.2011 10:30
Удаление элемента из символьного массива Mixim Visual C++ 4 03.12.2010 16:38
C++. Обработка строк при помощи указателей. akafanta Помощь студентам 0 01.11.2009 17:33
Сортировка массива указателей Джед Общие вопросы C/C++ 3 02.06.2009 14:18