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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.05.2013, 21:40   #1
kynew
Пользователь
 
Регистрация: 02.11.2012
Сообщений: 14
По умолчанию В задаче ошибка, не понимаю char * ( С++)

День добрый. Не хотел я писать, но самому мне не решить.
Вставлю много кода, прошу простить. Первая программа, написанная мною. Работающая. Вторая - не работает. Разница в том, что первая писалась мною произвольно, а во второй надо реализовать функции. Функции закомментированы. Собственно, если кто-то увидит ошибку, прошу показать где и пояснить в чем, если , конечно, не сложно. ошибок, думаю много будет(
Вариант работающий
Код:
int _tmain(int argc, _TCHAR* argv[])
{
	вводим строку ( str[81] )
	char delimiters[]=" !;:?-.,\""; // массив разделителей
	char buffer[81]="\0"; // проверяемое слово
	char last_word[81]="\0"; // предыдущее слово

	bool flag=true;// считаем, что между символами одни пробелы
	bool empty_str=true; // считаем, что строка пустая

	int cout [81]={}; // массив для хранения повторов слов
	int i=0,j=0,k=0;
	int index=0; 
	int start=0,length=0; // начало и длина слова
	for(i=0;i<strlen(str);i++) // проверяем, не пустая ли строка
		if( isspace(str[i]))
			empty_str=false;
	// находим первое слово
	length = strcspn(str,delimiters);
	strncpy(last_word,str,length);
	do
	{
		// ищем начало следующего слова и проверяем, находятся ли между ними только пробелы	
		start = strspn(str+length,delimiters) + length;
		if ( start <= strlen(str))
		{
			for (i=length; i<start; i++)
			{
				if (str[i]!=' ')
				{
					flag=false; // между словами есть что-то, кроме пробела 
				}
			}

			// ищем втрое слово и заносим его в буфер
			length = strcspn(str+start,delimiters)+start;
			strncpy(buffer,str+start,length-start);
			// cравниваем слова, если равные и между ними пробелы, значит слова повторяются
			if ((!strcmp(last_word,buffer)) && (flag == true) )
			{
				cout[j]++;
			}
			else
			{
				j++;		
			}
			// после проверки, заносим текущее слово, как предыдущее
			memset(last_word, '\0', strlen(last_word)); // очищаем строку, дабы не произошло неверного перезаписывания
			strcpy(last_word,buffer);
			memset(buffer, '\0', strlen(buffer)); // очищаем строку, дабы не произошло неверного перезаписывания
			flag=true;
		}
	}
	while (length<strlen(str));
	// ищем наибольшую цепочку повторяющихся слов
	if ( empty_str==false)
	{
		k=j;
		j=0;
		index=0;
		for (j=1;j<=k;j++) // ищем максимальную последовательность
		{
			if ( cout[index]<cout[j])
			{
				index=j;
			}
		}
		if(cout[index]!=0) 
		{
			cout[index]++;
		}
		printf ("%d", cout[index]); 
	}
	else printf ("0");
		return 0;
}


Неработающий

Код:
int countSubstrings;
/*!
* Разбивает строку на подстроки
* \param [in|out] str - строка
* \param [in] separators - разделители
* \param [in|out] substrings - массив указателей на начало и конец слов
* \param [out] countSubstrings - количество слов
*/
int stringToSubstrings ( const char str[81], const char separators[31], char *substrings[30][2]); 

/*!
* Подсчитывающет количество подряд идущих слов начиная с заданного
* \param [in|out] str - массив
* \param [in|out] substrings - массив указателей на начало и конец слов
* \param [in] countSubstrings - количество слов
* \param [in] startpos - слово, с которого начинается подсчет
* \param [out] cout - количество подряд идущих слов
*/
int countRepeats ( const char str[81], char * const substrings[30][2], int countSubstrings, char * startpos); 
int _tmain(int argc, _TCHAR* argv[])
{
	вводим строку ( str[81] )
	char separators[31]=" !;:?-.,\""; // массив разделителей
	char *substrings[30][2]; // выделенные слова
	int cout;
	char *startpos=0;
	countSubstrings = stringToSubstrings(str,separators,substrings);
	cout = countRepeats ( str,substrings,countSubstrings,startpos); 
	printf ("%d",cout);
        return 0;
}
int stringToSubstrings ( const char str[81], const char separators[31], char *substrings[30][2])
{
	
	int j=0;
	// находим первое слово
	*substrings[j][0] = strspn(str,separators);
	*substrings[j][1] = strcspn(str,separators);

	do
	{
		// ищем начало следующего слова и проверяем, находятся ли между ними только пробелы	
		*substrings[j+1][0] = strspn(str+*substrings[j][1],separators) + *substrings[j][1];
		if ( *substrings[j+1][0] <= strlen(str))
		{
			j++;
			*substrings[j][1] = strcspn(str+*substrings[j][0],separators)+*substrings[j][0];
		}
		countSubstrings++;
	}
	while (*substrings[j][1]<strlen(str));
	return countSubstrings;
}

Последний раз редактировалось kynew; 20.05.2013 в 21:42.
kynew вне форума Ответить с цитированием
Старый 20.05.2013, 21:43   #2
kynew
Пользователь
 
Регистрация: 02.11.2012
Сообщений: 14
По умолчанию

В неработающем варианте, функцию не работает. Не заполняется массив substring. Я знаю, что написал бред, но не знаю, как написать нормально. Возможно, если не сложно, направьте просто на путь понимания.....указатели меня убивают.
kynew вне форума Ответить с цитированием
Старый 20.05.2013, 23:08   #3
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
В неработающем варианте, функцию не работает. Не заполняется массив substring. Я знаю, что написал бред, но не знаю, как написать нормально. Возможно, если не сложно, направьте просто на путь понимания.....указатели меня убивают.
Можно пример? Типа "в функцию переданы массивы такой-то, такой-то и такой-то, ожидался результат такой-то, а получился сякой-то".

Навскидку, strspn возвращает позицию в тексте (число от 0 до длины строки), а substrings вроде как массив указателей. Более того, substrings передаётся в функцию неинициализированным, а Вы разыменовываете его аргументы.
Abstraction вне форума Ответить с цитированием
Старый 20.05.2013, 23:13   #4
kynew
Пользователь
 
Регистрация: 02.11.2012
Сообщений: 14
По умолчанию

Передается строка : " привет андрей привет привет " .
В substrings :
п, т
а, й
п, т
п, т

Я знаю, что strspn возвращает индекс буковки, но......я же говорю, что не понимаю, что мне сделать с этим чаровским массивом. Подскажите?
kynew вне форума Ответить с цитированием
Старый 20.05.2013, 23:23   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Передается строка : " привет андрей привет привет " .
В substrings :
п, т
а, й
п, т
п, т
Это так должно быть? Тогда почему элементы substrings - не char, а указатели на char?
Abstraction вне форума Ответить с цитированием
Старый 20.05.2013, 23:59   #6
kynew
Пользователь
 
Регистрация: 02.11.2012
Сообщений: 14
По умолчанию

Преподаватель выдал функции - реализуй и протестируй. Вот и делаю, что дали. А сделать не могу
kynew вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не понимаю где ошибка ВДПУ Помощь студентам 2 21.11.2011 20:50
Не понимаю в чём ошибка Eldrich JavaScript, Ajax 2 05.02.2011 01:50
Ошибка cannot convert from 'char *' to 'char [100]' Stellvertreter Общие вопросы C/C++ 5 30.05.2010 00:02
Не понимаю в чём ошибка levandowskiy Общие вопросы C/C++ 3 23.08.2009 12:48
Просто не понимаю б чём проблема!!!!!!!(char* && index) artush1984 Общие вопросы C/C++ 12 30.05.2009 03:30