Как найти одинаковые слова в строке c

Here is a program that does what you’re asking. It is hard coded for 4 words of a max 99 characters. That can be changed easily; I just fit it around your input. I also used strcmp and strcpy. Both of these functions can be implemented on your own (call them mystrcpy and mystrcmp and embed them). I’m not rewriting the string functions for you. I did show how to avoid strtok based on the other answer. I looked them up and they are not complex, but they did not add anything to the program and I didn’t want to reinvent the wheel. Last of all, I just used a simple linear search in the notInArray function. For a large data set this is not efficient (you would probably use some type of tree or hash).

This was compiled under gcc version 4.3.4

#include <stdio.h>
#include <string.h>

int notInArray(char arr[][100], char *word, int size);

int main() {
  char a[] = "This is a This";
  char *ptr;
  char strarr[4][100];
  char word[100];
  int pos = 0;
  int count = 0;
  int i;

  memset(&strarr,0,sizeof(strarr));
  printf("%snn",a);

  ptr = a;
  while (*ptr) {

    sscanf(ptr, "%s ", word);
    if (notInArray(strarr,word,4)) {
      strcpy(strarr[pos++],word);
      printf("%sn", word);
    }

    while (!isspace(*ptr++) && *ptr) {}
  }

  for (i=0; i<4; i++) {
    if (*strarr[i]) {
      printf("strarr[%d]=%sn",i, strarr[i]);
      count++;
    }
  }

  printf("nUnique wordcount = %dn", count);

  return(0);
}

int notInArray(char arr[][100], char *word, int size) {
  int i;

  for (i=0; i<size; i++) {
    if (*arr[i] && !strcmp(arr[i],word)) {
      return(0);
    }
  }

  return(1);
}

The output looks like:

~>a
This is a This

This
is
a
strarr[0]=This
strarr[1]=is
strarr[2]=a

Unique wordcount = 3

Enjoy.

Ввести 2 предложения, а затем исключить слова во втором предложении, которые имеются в первом. После чего вывести полученное второе предложение.

Смог сделать только удаление первого предложения. Подскажите пожалуйста.

#include <string>
#include <iostream>


using namespace std;

int main() {
    string non;

    getline(cin, non);
    int i;
    int b = 0;
    for (i = 0; i <= non.length(); i++) {
        if (non.at(i) == '.') {
            break;
        }
        b++;
    }
       b = b + 2;
    cout << b << endl;
    non.erase(0, b);

    cout << non;

    return 0;
}

задан 16 мар 2019 в 11:58

Maks Boll's user avatar

1

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;



int main()
{
string first;
string second;
string newStr = "";
string buf = "";
getline(cin, first);
int i = first.find(".");
second = first.substr(0, i);
for (i++; i < first.length(); i++) {
	if (first[i] != ' ') {

		buf += first[i];
	}


	if (first[i] == ' ' || i == first.length() - 1) {

		if (second.find(buf) == std::string::npos && buf != " ") {
			newStr += buf + ' ';
			buf = "";

		}
		else { buf = ""; }
	}
}
cout << newStr;
system("pause");
return 0;
}

Думаю можно лучше придумать, но пока как есть )
Если нужны будут комментарии, отпишите

ответ дан 16 мар 2019 в 14:15

AlexGin's user avatar

AlexGinAlexGin

1,1597 серебряных знаков14 бронзовых знаков

6

#include <vector>
#include <string>
#include <algorithm>
#include <sstream>
#include <iostream>

// Ввести 2 предложения, а затем исключить слова во втором предложении,
// которые имеются в первом. После чего вывести полученное второе предложение.

using str_vector_t = std::vector<std::string>;

template<template<typename...> typename Container, typename T>
bool contains(const Container<T>& c, const T& value) {
    return c.cend() != std::find_if(c.cbegin(), c.cend(), [&](const T& ref_value) {
        return ref_value == value;
    });
}

void split_string(const std::string& sentence, str_vector_t& words);

int main() {
    const auto sentence_f = "Show me you are a big boy";
    const auto sentence_s = "Let me stop you there big boy";    // me you big boy

    str_vector_t words_f, words_s;

    split_string(sentence_f, words_f);
    split_string(sentence_s, words_s);

    words_s.erase(
        std::remove_if(words_s.begin(), words_s.end(), [&](const auto& word_s) {
            return contains(words_f, word_s);
        }), words_s.end());

    std::cout << "Result: ";
    for (const auto& word : words_s)
        std::cout << word << ' ';

    return 0;
}

void split_string(const std::string& sentence, str_vector_t& words) {
    std::string word;
    std::stringstream stream { sentence };
    while (std::getline(stream, word, ' '))
        words.emplace_back(std::move(word));
};

ответ дан 24 апр 2019 в 18:51

isnullxbh's user avatar

isnullxbhisnullxbh

5,1282 золотых знака15 серебряных знаков38 бронзовых знаков

42 / 42 / 5

Регистрация: 25.03.2014

Сообщений: 444

1

Определить, есть ли в строке одинаковые слова

20.10.2016, 11:26. Показов 3756. Ответов 5


Студворк — интернет-сервис помощи студентам

Друзья подскажите как решить задачу необходимо это все через функцию. И без специальных функций работы со строками.
Определить есть ли в строке одинаковые слова.И вывести эти слова и сколько их



0



Programming

Эксперт

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

20.10.2016, 11:26

Ответы с готовыми решениями:

Дана строка. Определить, есть ли в данной строке одинаковые слова, и заменить каждое повторяющееся слово, словом повтор
Дана строка. Определить, есть ли в данной строке одинаковые слова, и
заменить каждое повторяющееся…

Вывести слова строки, которые отличны от последнего слова, и определить, есть ли в данной строке одинаковые слова
Дана строка, состоящая из слов, разделённых пробелами. Вывести слова этой строки, которые отличны…

Функция: Определить есть ли в строке одинаковые слова
Вводится строка. Определить есть ли в ней одинаковые слова с использованием функции.
Заранее…

Определить есть ли в данной строке одинаковые слова
Написать программу, с помощью подпрограмм, которая определяет есть ли в данной строке одинаковые…

5

afront

1493 / 1208 / 821

Регистрация: 29.02.2016

Сообщений: 3,597

20.10.2016, 13:10

2

Лучший ответ Сообщение было отмечено Dgaizer как решение

Решение

примерно так

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
       static List<string> stringSplit(string str)
        {
            str = str + " ";
            List <string> ar = new List <string>();
            string tmp = "";
            for (int i = 0; i < str.Length; i++)
            {
                if (str[i] != ' ')
                {
                    tmp = tmp + str[i];
                    continue;
                }
                ar.Add(tmp);
                tmp = "";
            }
            return ar;
        }
        static int isEqual(List<string> ar)
        {
            int k = 0;
            for (int i = 0; i < ar.Count - 1; i++)
            {
                for (int j = i + 1; j < ar.Count; j++)
                    if (ar[i] == ar[j])
                    {
                       Console.WriteLine(ar[i]);
                       k++;
                    }
            }
            return k;
        }
        static void Main()
        {
            string str = "test string test";
            List <string> ar = new List<string>();
            ar = stringSplit(str);
            int k = isEqual(ar);
            Console.WriteLine(k);
            Console.ReadLine();
        }



1



FourthDimension

28 / 28 / 23

Регистрация: 06.10.2016

Сообщений: 74

20.10.2016, 13:55

3

Извините, не совсем понятно, что значит «специальные функции работы со строкой».
Split — тоже можно считать «специальной», как и Compare и т.д.
У меня такой вариант:

Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Linq;
using System.Text.RegularExpressions;
 
namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            string str = "это строка, в которой ищется слово, слово должно повторяться! Слово может быть и с заглавной буквы, тогда слово считается?";
            //игнорируем цифры, буквы и пробел, удаляем знаки препинания
            Regex newReg = new Regex(@"[^0-9a-zа-я ]", RegexOptions.IgnoreCase);
            MatchCollection matches = newReg.Matches(str);
            foreach (Match mat in matches)
            {
                str = str.Replace(mat.ToString(), "");//если без учёта регистра добавить .ToLower();
            }
            string[] ar = str.Split(' ');
            //дальше в массиве ищем одинаковые элементы
            var groups = ar.Select((name) => new { name}).GroupBy(a => a.name);
            foreach (var group in groups)
            {
                string Name = "";
                foreach (var word in group)
                    //отсекаем повторные выводы через взведение Name
                    if (group.Count() > 1 & Name != word.name)
                    { 
                        Console.WriteLine("Слово "{0}" повторилоь {1} раз(а)! n", word.name, group.Count());
                        Name = word.name;
                    }
            }
            Console.ReadKey();
        }
    }
}



1



42 / 42 / 5

Регистрация: 25.03.2014

Сообщений: 444

20.10.2016, 16:44

 [ТС]

4

FourthDimension, afront, split compare и прочее обойтись без них



0



1493 / 1208 / 821

Регистрация: 29.02.2016

Сообщений: 3,597

20.10.2016, 16:50

5

Dgaizer, а где вы увидели split compare и прочее??
stringSplit — это мое название моей функции, вы что разницы не понимаете?



1



42 / 42 / 5

Регистрация: 25.03.2014

Сообщений: 444

20.10.2016, 16:52

 [ТС]

6

afront, я понимаю я просто уточнил, а ваш ник тоже попал под обстрел просто)



0



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
Выше функция подсчета


  • Вопрос задан

    более трёх лет назад

  • 2539 просмотров

Как-то так по моему. Не проверял.

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 и отдельно под каждую структуру), либо делать связный список :-) В общем задачка вроде простая, но из нее легко сделать довольно сложную.
И не забудьте потом всю эту память освободить.

Пригласить эксперта

Что я вижу сразу — вы не вернете ни как отсюда значение. Если речь идет именно о C, то я бы начал с того, что определил бы структуру типа:

struct WordCount{
char word[256];
unsigned int counters;
}

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


  • Показать ещё
    Загружается…

28 мая 2023, в 21:40

125000 руб./за проект

28 мая 2023, в 21:33

20000 руб./за проект

28 мая 2023, в 21:27

200000 руб./за проект

Минуточку внимания

C# — Нахождение повторяющихся слов в тексте

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string file = @"input.txt";
            string line;
            using (var reader = File.OpenText(file))
            {
                while ((line = reader.ReadLine()) != null)
                {
                    ParseLine(line); /* parse line */
                }
            }
            // Order by values.
            var items = from pair in Words 
                        orderby pair.Value descending 
                        select pair;
 
            
            int n = 0;
            using (var dest = File.AppendText("output.txt")) 
            {
                foreach (KeyValuePair<string, int> pair in items)
                {
                    dest.WriteLine(string.Format("{0}: {1}", pair.Key, pair.Value));
                    n++;
                    if (n < 50)// Display 50 top results.
                    {
                        Console.WriteLine("{0}: {1}", pair.Key, pair.Value);
                    }
                }
            }
            Console.ReadLine();
        }
 
        static Dictionary<string, int> Words = new Dictionary<string, int>();
        static void ParseLine(string s)
        {
            string word = "";
            for (int i = 0; i < s.Length ; i++)
            {
                if (char.IsLetter(s[i]))
                {
                    word += s[i];
                }
                else
                {
                    word = word.ToLower();
                    if (Words.ContainsKey(word))
                    {
                        Words[word]++;
                    }
                    else
                    {
                        if (word.Length>2)
                        {
                            Words.Add(word, 1);
                        }
                    }
                    word = "";
                }
            }
        }
    }
}
 

Понравилась статья? Поделить с друзьями:
  • Как найти колонки подключенные к компьютеру
  • Как найти диск который не отображается
  • Veuillez executer le programme de lancement du jeu dirt 2 exe как исправить
  • No image available как исправить
  • Золото скифов как его нашли