m_avrina
@m_avrina
Студентота.

Как искать повторяющиеся слова в строке?

void counter_of_all_word(int count, int max, char**mass_of_all_word,int *mass)
{
	int temp_count = 0;
	char **empty_mass = (char**)malloc(count * sizeof(char*));
	for (int i = 0; i < count; i++)
		empty_mass[i] = (char*)malloc(max * sizeof(char));
	int *count_mass = (int*)malloc(count * sizeof(int));
	int i = 0, j = 0;
	int flag = 0;
	for (i = 0; i < count; i++)
	{
		flag = 0;
		for (j = 0; j < count; j++)
		{			
			flag = 0;
			if (empty_mass[j] == mass_of_all_word[j])
			{
				temp_count +1;
				count_mass[i] = temp_count;
			}
			else
				for (int k = 0; k < count; k++)
				{
					if (empty_mass[k] == mass_of_all_word[j])
					{
						flag = 1;
						i++;
						break;
					}
					else
					{
						empty_mass[j] = mass_of_all_word[j];
						break;
					}
				
				}
			if (flag == 1)
				break;
		}
	}
	for (i = 0; i < count; i++)
		printf(" %d)%d ",i,count_mass[i]);

}


Сломалась голова(
Нужно подсчитать кол-во одинаковых слов в массиве строк и записать их парами
"слово-кол-во"
Но что-то не так;c
Выше функция подсчета
  • Вопрос задан
  • 2939 просмотров
Решения вопроса 1
@res2001
Developer, ex-admin
Как-то так по моему. Не проверял.
void counter_of_all_word(int count, int max, char**mass_of_all_word,int *mass)
{
  char **empty_mass = (char**)calloc(count, sizeof(char*));
  int *count_mass = (int*)calloc(count, sizeof(int));
  int i, j, k;
  for (i = 0; i < count; i++)
  {
     for(j=i;j<count;++j)
     {
        // Ищем в mass_of_all_word строку не существующую в empty_mass
        for(k=0;k<i;++k)
           if(strcmp(empty_mass[k], mass_of_all_word[j])
               break;
        // Строка найдена - mass_of_all_word[j]
        if(k == i)
        {
               empty_mass[i] = mass_of_all_word[j];
               count_mass[i] = 1;
               break;
        }
      }
      // Не существующие строки кончились 
      if(j == count)
         break;

      // Теперь считаем количество новых строк
     ++j;
     if(j < count)
         for (; j < count; j++)
           if(strcmp(empty_mass[i], mass_of_all_word[j])
               ++count_mass[i];
  }            
/*
На выходе из цикла в empty_mass уникальные слова. Количество уникальных строк в i. В count_mass количество каждого уникального слова в mass_of_all_word.
Осталось придумать как всю эту красоту вернуть вызывающей функции.

Здесь я не копирую строки, а просто присваиваю указатель строки из mass_of_all_word в empty_mass. Если нужно копировать строки в empty_mass, то нужно выделить память под строку, затем функцией strcpy или memcpy скопировать строку.
*/
}

Сначала пытался разобрать ваши ошибки, но потом плюнул - проще написать код.
И разберитесь с указателями и строками в Си, вы явно не понимаете как с ними работать.
На счет возврата значений - послушайтесь совета Павел Каптур определите структуру с двумя полями - указатель на строку и счетчик количества и работайте с массивом структур. Тогда просто будете возвращать этот массив структур. При этом память под массив структур можно выделять по максимальному количеству (count) либо отдельно под каждую найденную строку (тогда нужно выделять память под массив указателей на структуры размером в count и отдельно под каждую структуру), либо делать связный список :-) В общем задачка вроде простая, но из нее легко сделать довольно сложную.
И не забудьте потом всю эту память освободить.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
drem1lin
@drem1lin
чуть программист, чуть чуть админ...
Что я вижу сразу - вы не вернете ни как отсюда значение. Если речь идет именно о C, то я бы начал с того, что определил бы структуру типа:
struct WordCount{
char word[256];
unsigned int counters;
}

но так как количество слов заранее не известно, надо делать динамический массив таких структур, или список.
далее находя слово, ищете структуру и в ней увеличиваете счетчик на 1. Если не нашли, то создаете новую. Элементарно решается с помощью std::list, но это уже с++.
Если говорить об ошибках - вы ни где не выделяете слова, так empty_mass[j] == mass_of_all_word[j] вы копируете указатель на строку.
Что бы я сделал:
1. все же описать структуры, тогда вы не перепутаете индексы
2. разделить код на функции, например, функция обработки строки -> передать указатель на массив структур со словами и строку -> в ней вызвать код дробления строки на слова и получить двумерный массив слов, которые потом добавить в массив структур со словами или обработать строку как вам удобно и в цикле пройти все строки
3. добавить обработку возвращаемых значений функций
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы