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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2010, 16:15   #1
DarkMage
Пользователь
 
Регистрация: 02.04.2010
Сообщений: 12
По умолчанию Пересечение двух строк

Здравствуйте! Мне нужно реализовать пересечение двух строк, тоесть найти общие слова в строках и записать их в третью строку.
вот мой код:
Код:
void ob(Dictionary& d)
{
	bool f = false;
	int i=0,j=0,k,s,v,p,n,m,q=0,e=0,g=0,u=0;
	char *z,b[200],h[200],mass[10],na[100];
	FILE* file;
	FILE* file1;
	FILE* file2;
	file = fopen(name, "r");
	file1 = fopen(d.name, "r");
	fgets(b,100,file);
	fgets(h,100,file1);
	k=strlen(b);
	p=strlen(h);
	z=strtok(b, " ");	
	for(g=0;g<k;g++)
	{
	v = strlen(z);
	for(i=0;i<k;i++)
	{
		e=0;
		f = false;			
		if(h[i]==z[j]) 
                        { for(n=i,m=j;m<v;m++,n++) 
{ 
if (h[n]==z[m]) f = true; 
else {f = false; break;}
}
}
if(f==true) 
{
while(q<v)	{mass[q]=z[e];q++;e++;} 
z=strtok(NULL, " ");
v = strlen(z);}		
	}
	u+=v;
	if(u+g+1==k) break;
	z=strtok(NULL, " ");
	}
	cout<<"Введите имя нового словаря"<<endl;
	cin>>na;
	file2 = fopen(na,"w");
	fputs(mass, file2);
	fclose( file );
	fclose( file1 );
	fclose( file2 );
}
вообщем при работе он выдает ошибку функции strlen.
если у кого есть идеи уменьшить или упростить эту функцию пожалуста напишите.

Последний раз редактировалось Sazary; 03.04.2010 в 00:33.
DarkMage вне форума Ответить с цитированием
Старый 03.04.2010, 18:55   #2
Assemblerru
Форумчанин
 
Регистрация: 28.01.2010
Сообщений: 224
По умолчанию

Я сильно не въезжал в выше написанный вопрос - попробуй воспользоваться методами строки AnsiString

1 метод Pos =
int A = S1.Pos (S2);//найдет первое вхождение в строке S1 строки S2 при неудачи вернет 0 или если найдет вхождение то вернет индекс первого символа

2 метод Delete =
AnsiString s1 = S2.Delete (1, 10);//удалит в S2 с первого символа 10 символов подряд. а также вернет полдученное значение в s1

3 метод + (эта операция перегружена для строк типа AnsiString)
S3 = S1+S2;//в конец строки S1 добавит S2

в принцепе эти методы не все но их достаточно чтобы решить твою проблему
всему свое время как зиме и весне
и каждому солнцу свой неба кусок
Assemblerru вне форума Ответить с цитированием
Старый 03.04.2010, 21:26   #3
DarkMage
Пользователь
 
Регистрация: 02.04.2010
Сообщений: 12
По умолчанию

Что то у меня не работает твои методы, может подскажеш как вводить их правильно. У кого есть еще идеи, как реализовать функцию поиска общих слов в двух строках, пишите!
DarkMage вне форума Ответить с цитированием
Старый 11.04.2010, 20:51   #4
Sapfil
Пользователь
 
Аватар для Sapfil
 
Регистрация: 11.01.2010
Сообщений: 24
По умолчанию

Товарищи форумчане!
Я сделал это задание. И это было мое первое задание, связанное с строками, символами и пр. По-этому я думаю, что оно сильно НЕоптимальное. Привожу код, а ниже задам несколько конкретных вопросов:

Код:
#include <iostream>
using namespace std;

// typedef unsigned short int USINT;

int main() 
{
	setlocale (LC_ALL,"");

	// Ввод исходных строк
	char string1[80],string2[80];
	cout << "Введите первую строку:\n";
	cin.get(string1,79);
	getchar();
	cout << "\nВведите вторую строку:\n";
	cin.get(string2,79);
	getchar();
	
	// Обработка строк - добавление пробелов в начале строки и в конце
	// А так же установка концевого символа '\0'
	string1[strlen(string1)+1] = '\0';
	string1[strlen(string1)] = ' ';
	for (int i = (int) strlen(string1); i >= 0; i--)
		string1[i+1] = string1[i];
	string1[0] = ' ';

	string2[strlen(string2)+1] = '\0';
	string2[strlen(string2)] = ' ';
	for (int i = (int) strlen(string2); i >= 0; i--)
		string2[i+1] = string2[i];
	string2[0] = ' ';	

	// Создание третьей строки.
	char string3[160];
	string3[0] = '\0';
	
	// ОПИСАНИЕ ПЕРЕМЕННЫХ:
	// i - счетчик символов в первой строке, j - во второй.
	// k - временная перменная для расчета длины слова.
	// t - временная переменная для переписывания найденного слова в третью строку.
	// word (bool) - "флаг одинаковости слов" :)
	// str3_lenth - длина третьей строки ДО записи в нее очередного слова.
	int k, str3_lenth;
	bool word;

	// собсно сам механизм поиска %)
	for (int i = 1; i < (int)strlen(string1)-1; i++)
		if (string1[i-1] == ' ' && string1[i] != ' ') //поиск начала очередного слова в первой строке.
			for (int j = 1; j < (int)strlen(string2)-1; j++)
				if (string2[j-1] == ' ' && string2[j] != ' ') //поиск начала очередного слова во второй строке.
				{
					// проверка слов на одинаковость.
					for ( k = 0, word = true; string1[i+k] != ' '; k++)	//поиск пробела (конца слова)	
						if (string1[i+k] != string2 [j+k] || string1[i+k+1] != string2 [j+k+1]) 
							word = false; 
					
					if (word)	// если найдено "одинаковое слово" :)
					{			// то переписываем его в третью строку
						str3_lenth = (int)strlen(string3);
						for(int t = 0; t <= k; t++)
							string3[str3_lenth + t] = string1[i+t];
						string3[str3_lenth + k + 1] = '\0';
					}						
				}
			
	// Вывод результата.
	if (strlen(string3))
		cout << "\nВот слова, которые встречаются и в первой и во второй строчке:" << endl << string3;
	else cout << "\nНет слов, которые встречаются в обоих словах. :(";

	cout << "\n\nДля выхода нажмите любую клавишу. :)";
	getchar();
	
	return 0;
}
Ну а теперь собсно вопросы:
1. Если пытаться вводить РУССКИЕ буква, то на выходе получаются "кракозябры" - почему так? Это при том, что сервисные сообщения выводятся как положено по-русски. Возможно, это зависит от зеленой строчки. Где вообще можно про это почитать?

2. Какой тип днных выдает функция strlen?

3. Как можно оптимизировать данную программу? Я одним местом чую, чтоо все это можно сделать гораздо проще, но пока не знаю как. Возможно, есть такие функции из семейства str- , которые сильно упростили бы эту прогу.

4. Есть ли на этом форуме модератор? Я к тому что за 5 дней, сколько существует тема - появилось более 130 (!!!) новых тем. Много повторяющихся, часто встречаются вопли "хэлп" без кода
Sapfil вне форума Ответить с цитированием
Старый 11.04.2010, 22:04   #5
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

Цитата:
1. Если пытаться вводить РУССКИЕ буква, то на выходе получаются "кракозябры" - почему так? Это при том, что сервисные сообщения выводятся как положено по-русски. Возможно, это зависит от зеленой строчки. Где вообще можно про это почитать?
OemToChar

Цитата:
2. Какой тип днных выдает функция strlen?
size_t

Цитата:
3. Как можно оптимизировать данную программу? Я одним местом чую, чтоо все это можно сделать гораздо проще, но пока не знаю как. Возможно, есть такие функции из семейства str- , которые сильно упростили бы эту прогу.
Нормально

Код:
4. Есть ли на этом форуме модератор? Я к тому что за 5 дней, сколько существует тема - появилось более 130 (!!!) новых тем. Много повторяющихся, часто встречаются вопли "хэлп" без кода
Много модераторов есть. А тебе они(темы) мешают чтоли? Что видят, то закрывают.
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 18.04.2010, 18:27   #6
Sapfil
Пользователь
 
Аватар для Sapfil
 
Регистрация: 11.01.2010
Сообщений: 24
По умолчанию

Вот и нифига! Эта прога не давала мне покоя и я ее оптимизировал малясь. в частности, насильное прибавление пробелов в начало и конец исходных строк было уж очень побыдлокодерски. Наконец-то понял, как надо сделать. В коде внесенные изменения выделены цветом. Позорных 10 строчек с добавлением пробелов в начало и конец - теперь нет. Вместо них - усложненное условие поиска конца слова.

Код:
#include <iostream>
using namespace std;

// typedef unsigned short int USINT;

int main() 
{
	setlocale (LC_ALL,"russian");

	// Ввод исходных строк
	char string1[80],string2[80];
	cout << "Введите первую строку:\n";
	cin.getline(string1,79);
	cout << "\nВведите вторую строку:\n";
	cin.getline(string2,79);
	
	// Создание третьей строки.
	char string3[160];
	string3[0] = '\0';
	
	// ОПИСАНИЕ ПЕРЕМЕННЫХ:
	// i - счетчик символов в первой строке, j - во второй.
	// k - временная перменная для расчета длины слова.
	// t - временная переменная для переписывания найденного слова в третью строку.
	// word (bool) - "флаг одинаковости слов" :)
	// str3_lenth - длина третьей строки ДО записи в нее очередного слова.
	int k, str3_lenth;
	bool word;

	// собсно сам механизм поиска %)
	for (int i = 0; i < (int)strlen(string1)-1; i++)
		if (i == 0 || (string1[i-1] == ' ' && string1[i] != ' ')) //поиск начала очередного слова в первой строке.
			for (int j = 0; j < (int)strlen(string2)-1; j++)
				if (j == 0 || (string2[j-1] == ' ' && string2[j] != ' ')) //поиск начала очередного слова во второй строке.
				{
					
					// проверка слов на одинаковость.
					for ( k = 0, word = true; string1[i+k] != ' ' && string2[j+k] != '\0' && string1[i+k] != '\0'; k++)		
						if (string1[i+k] != string2 [j+k] 
							|| (string1[i+k+1] != string2 [j+k+1]
							&& ( !(string1[i+k+1] == '\0' && string2 [j+k+1] == ' ')      // обработка ситуаций когда одно
								&& !(string1[i+k+1] == ' ' && string2 [j+k+1] == '\0')))) // слово заканчивается пробелом,
								word = false;											  // а второе знаком '\0'
					if (word)	// если найдено "одинаковое слово" :)
					{			// то переписываем его в третью строку
						str3_lenth = (int)strlen(string3);
						for(int t = 0; t <= k; t++)
							string3[str3_lenth + t] = string1[i+t];
						string3[str3_lenth + k + 1] = '\0';
					}						
				}
			
	// Вывод результата.
	if (strlen(string3))
		cout << "\nВот слова, которые встречаются и в первой и во второй строчке:" << endl << string3;
	else cout << "\nНет слов, которые встречаются в обоих строчках. :(";

	cout << "\n\nДля выхода нажмите любую клавишу. :)";
	getchar();
	
	return 0;
}
Sapfil вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как же все таки сравнить содержимое двух строк? LOST94 Общие вопросы C/C++ 7 23.03.2010 14:52
пересечение двух множеств Олежек Фриланс 7 10.03.2010 18:46
сравнение двух строк aza_kaz Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 01.01.2010 23:40
Поиск двух одинаковых строк идущих последовательно stasbz Microsoft Office Excel 4 21.06.2009 18:40
Формула (Сумма произведений двух строк) Propan Microsoft Office Excel 2 24.04.2009 14:25