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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2012, 11:59   #1
КРИЖ
Пользователь
 
Регистрация: 08.03.2011
Сообщений: 44
Радость поиск слов в строке, которые повторяются

задача состоит в следующем вывести слова из строки и количество их повторений
пример:qwert name help qwert far help help name
вывод слов: qwert повторений 2, name повторений 2, help повторений 3, far повторений 1.
написал программу:
Код:
#include "fstream"
#include "iostream"
#include "cstring"
#include "cctype"
#include "stdafx.h"
#include "iostream"
#include "conio.h"

using namespace std;

int main()
{
	const int size = 256;
	int count=0;//переменная для подсчета повторении слова
	int wordcount=0;//переменная для подсчета количества слов в string
	int n=0;//вспомогательная переменная
	char string[size];
	cout<<"enter the text"<<endl;
	gets(string);//вводим string
	char *colword;//вспомогательная строка для подсчета слов в string
	int l_string=strlen(string);//считываем фактическую длину строки string
	colword=strtok(string," ");
    while (colword!=NULL)
           {
             colword=strtok(NULL," ");
             wordcount++;
           }
	for(int i=0;i<wordcount;i++)//цикл в котором будет к пепеменной word присваеватяс слово от 1 первого до н-го
	{
		for(int j=0;j<l_string;j++)//цикл где объявлятся переменная word и идет пробежка по строке
		{
			char *word= new char[size];
			if(string[j]==' ')//как только string[j]= пробелу то начинается цикл 
			{
				for(int k=n;k<j;k++)// цикл который начинается как только встречается пробел идет копирование строки string в word с n по j-1 символ где j-пробел
				{
					word[j]=string[j];
					n++;//увеличиваем n до символа стоящего до пробела
				}
				n++;//увеличиваем на 1 
				word[n]='\0';//так как в цикле было n скопированных символов то n- норер есть буква а в преведущей строке порядок n был увечичен для того чтоб тут после символа завершит строку
				int l_word=strlen(word);//ищем фактическую длину строки
				char *p = string;
				while(p=strstr(p,word))//ищем слова которые повторяются
				{
					count++;//увеличиваем счетчик повтора на 1 если есть повторяющиеся слово
					char *c=p;
					p +=l_word;
					if(c!=string)
						if(!ispunct(*(c-1)) && !isspace(*(c-1)))
							continue;
					if(ispunct(*p) || isspace(*p) || (*p == '\0'))
						count++;
				}
				cout<<word<<": reps= "<<count<<endl;
				getch();
				count=0;
			}
		}
	}
}
проблема в том что не идет присвоения word для поиска слов.
где и почему не правильно? и как сделать чтоб заработала?
КРИЖ вне форума Ответить с цитированием
Старый 14.12.2012, 12:44   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Присвоение идёт. Но на каждой итерации цикла по j word присваивается адрес нового выделенного блока памяти. В цикле по k в j-ю позицию массива word много раз подряд записывается некоторое значение. Поскольку к этому моменту j, вероятно, не равно 0, результат вычисления strlen(word) не определён, равно как и результат вызова strstr применительно к word.
Abstraction вне форума Ответить с цитированием
Старый 14.12.2012, 13:31   #3
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

КРИЖ

Честно говоря, код уж очень ужоснахистый.
На C++ задача решается намного проще:

Код:
#include <iostream>
#include <locale>

#include <string>
#include <sstream>
#include <map>

#include <algorithm>

namespace std {

	template <typename T, typename U>
	std::ostream& operator<< (std::ostream& os, const std::pair<T, U>& v)
	{ return os << "Word: " << v.first << ", Repeats: " << v.second; }
}

typedef std::map<std::string, size_t> WordsMap;

void print(std::string s)
{
	WordsMap map;
	std::string word;

	std::istringstream ss(s);
	while (ss >> word)
		++map[word];

	typedef std::ostream_iterator<WordsMap::value_type> O;
	std::copy(map.begin(), map.end(), O(std::cout, "\n"));
}

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

	std::string text;
	//std::getline(std::cin, text);
	text = "qwert name help qwert far help help name";

	print(text);

	return 0;
}
пример работы: http://codepad.org/Ctdxzke1
Rififi вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
(С++) поиск слов в строке, которые повторяются КРИЖ Помощь студентам 0 13.12.2012 19:25
Поиск и вывод слов со строки которые имеют указанную букву ovner Общие вопросы C/C++ 2 07.10.2012 01:43
В строке определить количество слов, которые содержат букву «а» (Delphi) Dark Raven Помощь студентам 2 19.01.2012 16:56
MYSQL запрос, выборать поля, которые повторяются Delphinchik PHP 1 13.02.2011 21:53
Поиск слов в строке Neymexa Общие вопросы C/C++ 3 16.12.2008 18:33