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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2008, 21:59   #11
sasha45
Пользователь
 
Регистрация: 29.01.2008
Сообщений: 19
По умолчанию

Ок)) Конечно потерплю))) Буду ждать ответа))
sasha45 вне форума Ответить с цитированием
Старый 29.01.2008, 22:29   #12
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

В общем, вот Вам работающий код:
Код:
#include <windows.h>
#include <TCHAR.H>
#include <stdio.h>


//types 
typedef struct _WORD_DESCRIPTOR
{
	LPTSTR				pWord;
	LONG				nWordLen;
}WORD_DESCRIPTOR, *LPWORD_DESCRIPTOR;

typedef struct _WORDS
{
	LONG				nWordCount;
	LPWORD_DESCRIPTOR	pWords;
}WORDS, *LPWORDS;

// forward
BOOL	__stdcall	AddWord			(LPSTR pWord, LONG nWordLen, LPWORDS pWordsArray);
BOOL	__stdcall	SplitString		(LPSTR pSource, LPWORDS pWordsArray); 
BOOL	__fastcall	IsDelimiter		(TCHAR tcDelimiter);


// statics
static WORDS Words;
static TCHAR StringToSplit[] = TEXT(
"The lstrcpyn function copies a specified number \
of characters from a source string into a buffer. ");



// definitions
BOOL	__stdcall	AddWord			(LPSTR pWord, LONG nWordLen, LPWORDS pWordsArray)
{
	BOOL bResult = FALSE;
	if(pWord && nWordLen > 0 && pWordsArray)
	{
		LPVOID pTmp = realloc(pWordsArray->pWords, (pWordsArray->nWordCount + 1) * sizeof(WORD_DESCRIPTOR));
		if(pTmp)
		{
			pWordsArray->pWords = (LPWORD_DESCRIPTOR)pTmp;

			pWordsArray->pWords[pWordsArray->nWordCount].pWord = pWord;
			pWordsArray->pWords[pWordsArray->nWordCount].nWordLen = nWordLen;
			pWordsArray->nWordCount += 1;
			bResult = TRUE;
		}
	}
	return bResult;
}

BOOL	__stdcall	SplitString		(LPSTR pSource, LPWORDS pWordsArray)
{
	LONG	i;
	LPSTR	pText = pSource;
	
	while(*pText){
		i = 0;
		while (pText[i] && !IsDelimiter(pText[i])) i ++;
		if(!AddWord(pText, i, pWordsArray)) return FALSE;
		pText += i;
		while (IsDelimiter(*pText)) pText += sizeof(TCHAR);
	}
	return TRUE;
}

BOOL	__fastcall	IsDelimiter		(TCHAR tcDelimiter)
{
	return (tcDelimiter == ' ');
}

int _tmain(int argc, TCHAR* argv[])
{
	LONG idx;
	LPTSTR pBuf = NULL;

	Words.nWordCount = 0;
	Words.pWords = NULL;
	if(!SplitString(StringToSplit, &Words)) return -1;

	for(idx = 0; idx < Words.nWordCount; idx ++)
	{
		pBuf = (LPTSTR)realloc(pBuf, sizeof(TCHAR) * (Words.pWords[idx].nWordLen + 1));
		lstrcpyn(pBuf, Words.pWords[idx].pWord, Words.pWords[idx].nWordLen + 1);
		pBuf[Words.pWords[idx].nWordLen] = 0;
		printf("%s\n", pBuf);
	}

	free(pBuf);
	return 0;
}
Не ахти какой оптимальный (специально ), без перехвата исключений, но зато использующий разные функции. Руки, правда, сами пишут все в майкрософтовских типах, разберетесь, я надеюсь После забивания массива советую посмотреть на функцию qsort (в MSDN, ссылка у Вас есть) и вот сюда: http://msdn2.microsoft.com/en-us/lib...ha(VS.80).aspx , особенно на isspace - сильно упростит Вам жизнь . Если вдруг не будет компилироваться - кричите, у меня она выводит вот это:
Код:
The
lstrcpyn
function
copies
a
specified
number
of
characters
from
a
source
string
into
a
buffer.
Ну а с передачей строки, надеюсь, сами разберетесь.

P.S. Уже потом заметил, поменяйте LPSTR на LPTSTR, где я пропустил, проще будет под юникод компилировать.

Последний раз редактировалось B_N; 29.01.2008 в 22:34.
B_N вне форума Ответить с цитированием
Старый 29.01.2008, 22:43   #13
DIIT
Пользователь
 
Регистрация: 01.12.2007
Сообщений: 12
По умолчанию

Делал такое давно, извини у меня щас мало времени-если я не ошибаюсь эта часть моей программы делала именно это.
Код:
void main()
{
   clrscr();
   char str[255];
   char s[21][21];
   char *p;
   int i=0, c=1, l=1, rez=0;
   int j, x;
   gets(str);
   while(str[i])
   {
   if(str[i]==' ')
      c++;
   i++;
   }
   i=0;
   p=strtok(str," ");
   while(p)
      {
      strcpy(s[i],p);
      i++;
      p=strtok(NULL," ");
      }
DIIT вне форума Ответить с цитированием
Старый 30.01.2008, 10:26   #14
sasha45
Пользователь
 
Регистрация: 29.01.2008
Сообщений: 19
По умолчанию

B_N, спасибо большое за этот код. Но есть некоторые проблемы. К сожаленю мы еще не проходили классы, поэтому я пока даже не имею представления о них, плюс, тут я увидел еще структуры, в них я более менее разбираюсь, но препод меня послал и сказал делать все без струткур. В итоге нужно написать эту функцию безо всяких наворотов, при помощи циклов, выделения памяти, указателей и т.п.
Я очень извинияюсь за то, что Вы потратили на это время.
sasha45 вне форума Ответить с цитированием
Старый 30.01.2008, 13:53   #15
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от sasha45 Посмотреть сообщение
B_N, спасибо большое за этот код. Но есть некоторые проблемы. К сожаленю мы еще не проходили классы, поэтому я пока даже не имею представления о них, плюс, тут я увидел еще структуры, в них я более менее разбираюсь, но препод меня послал и сказал делать все без струткур. В итоге нужно написать эту функцию безо всяких наворотов, при помощи циклов, выделения памяти, указателей и т.п.
Я очень извинияюсь за то, что Вы потратили на это время.
Хех.. А где Вы там классы-то увидали? Самый что ни есть "Цэ". Держите вот такой вариантец:
Код:
#include <string.h>
#include <stdlib.h>
#include <stdio.h>

// forward
long	__stdcall	AddWord			(char* pWord, long nWordLen);
long	__stdcall	SplitString		(char* pSource); 
long	__fastcall	IsDelimiter		(char cDelimiter);

// statics
static long nWordCount = 0;
static char** pWords = NULL;

// definitions
long	__stdcall	AddWord			(char* pWord, long nWordLen)
{
//	long i;		// предназначена для побайтного копирования слова
	long nResult = 0;
	if(pWord && nWordLen > 0)
	{
		char** pTmp = (char**)realloc(pWords, (nWordCount + 1) * sizeof(char*));
		if(pTmp)		// если увеличение длины вектора прошло успешно
		{
			pWords = pTmp;
			
			// выделяем память под новое слово и кладем указатель в только что 
			// добавленный элемент вектора, не забываем про завершающий \0
			pWords[nWordCount] = (char*)malloc(sizeof(char) * (nWordLen + 1));
			// копируем слово в новый буфер
			strncpy(pWords[nWordCount], pWord, nWordLen);
/*
			// либо с помощью memmove
			memmove(pWords[nWordCount], pWord, nWordLen);
*/

/*
			// другой вариант - копируем побайтно (вернее по-char-но)
			// для этого убираем комментарий с переменной i
			for(i = 0; i < nWordLen; i++) pWords[nWordCount][i] = pWord[i];
*/

			// поскольку строку мы копируем в том числе и вручную, прописываем \0 явно
			pWords[nWordCount][nWordLen] = 0;

			// увеличиваем счетчик слов
			nWordCount ++;
			nResult = 1;
		}
	}
	return nResult;
}

long	__stdcall	SplitString		(char* pSource)
{
	long	i;
	char*	pText = pSource;
	
	while(*pText){
		i = 0;
		while (pText[i] && !IsDelimiter(pText[i])) i ++;
		if(!AddWord(pText, i)) return 0;
		pText += i * sizeof(char);
		while (IsDelimiter(*pText)) pText += sizeof(char);
	}
	return 1;
}

long	__fastcall	IsDelimiter		(char cDelimiter)
{
	return (cDelimiter == ' ');
	//	здесь мы можем модифицировать условие, по которому определяем разделитель слов, 
	//	например так: 
	//	return (cDelimiter == ' ' || cDelimiter == '-');
	//	теперь дефис тоже будет считаться разделителем, наравне с пробелом
}

int main(int argc, char* argv[])
{
	long	i;

	if(!SplitString("The quick brown fox jumps over the lazy dog.")) return -1;

	for(i = 0; i < nWordCount; i ++) printf("%s\n", pWords[i]);
	return 0;
}
P.S. С сортировкой сами справитесь? подсказка - qsort.

Последний раз редактировалось B_N; 30.01.2008 в 13:57.
B_N вне форума Ответить с цитированием
Старый 30.01.2008, 14:14   #16
sasha45
Пользователь
 
Регистрация: 29.01.2008
Сообщений: 19
По умолчанию

Цитата:
P.S. С сортировкой сами справитесь? подсказка - qsort.
Думаю справлюсь, уже читал про эту функцию=))
А вот еще вопрос про:
Код:
# eturn (cDelimiter == ' '); 
#     //  здесь мы можем модифицировать условие, по которому определяем разделитель слов,  
#     //  например так:  
#     //  return (cDelimiter == ' ' || cDelimiter == '-'); 
#     //  теперь дефис тоже будет считаться разделителем, наравне с пробелом
Здесь прописываются разделители? Можно даже воткнуть точку, запятую и т.д?
sasha45 вне форума Ответить с цитированием
Старый 30.01.2008, 14:17   #17
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от sasha45 Посмотреть сообщение
Думаю справлюсь, уже читал про эту функцию=))
А вот еще вопрос про:
Код:
# eturn (cDelimiter == ' '); 
#     //  здесь мы можем модифицировать условие, по которому определяем разделитель слов,  
#     //  например так:  
#     //  return (cDelimiter == ' ' || cDelimiter == '-'); 
#     //  теперь дефис тоже будет считаться разделителем, наравне с пробелом
Здесь прописываются разделители? Можно даже воткнуть точку, запятую и т.д?
Ну дык проБОВАЙте Формат я указал
B_N вне форума Ответить с цитированием
Старый 30.01.2008, 14:23   #18
sasha45
Пользователь
 
Регистрация: 29.01.2008
Сообщений: 19
По умолчанию

Спасибо большое за помощь=)) А если вдруг появятся вопросы, можно будет обратиться к Вам?
sasha45 вне форума Ответить с цитированием
Старый 30.01.2008, 14:43   #19
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от sasha45 Посмотреть сообщение
Спасибо большое за помощь=)) А если вдруг появятся вопросы, можно будет обратиться к Вам?
Ну так спрашивайте, кто же против.
B_N вне форума Ответить с цитированием
Старый 30.01.2008, 15:03   #20
sasha45
Пользователь
 
Регистрация: 29.01.2008
Сообщений: 19
По умолчанию

Код:
# //types   
# typedef struct _WORD_DESCRIPTOR  
# { 
#     LPTSTR              pWord; 
#     LONG                nWordLen; 
# }WORD_DESCRIPTOR, *LPWORD_DESCRIPTOR;  
#   
# typedef struct _WORDS  
# { 
#     LONG                nWordCount; 
#     LPWORD_DESCRIPTOR   pWords; 
# }WORDS, *LPWORDS;  
#   
# // forward  
# BOOL    __stdcall   AddWord         (LPSTR pWord, LONG nWordLen, LPWORDS pWordsArray);  
# BOOL    __stdcall   SplitString     (LPSTR pSource, LPWORDS pWordsArray);   
# BOOL    __fastcall  IsDelimiter     (TCHAR tcDelimiter);  
#   
#   
# // statics  
# static WORDS Words;  
# static TCHAR StringToSplit[] = TEXT(  
# "The lstrcpyn function copies a specified number \  
# of characters from a source string into a buffer. ");
Можно как-нибудь в двух слова про это? Это создание пользовательского типа? или я что-то путаю?
sasha45 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
дан текстовый массив из 200 букв. Выстроить в алфавитном порядке все строчные буквы Тина Помощь студентам 6 02.07.2008 22:53
отсортировать таблицу сначала в алфавитном порядке фамилий продавцов, затем в порядке возростания получен Lora Microsoft Office Excel 1 31.05.2008 17:22
Во вводимом тексте переписать все слова в обратном порядке. menlo Помощь студентам 5 17.11.2007 10:18