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
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
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
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 как решение Решениепримерно так
1 |
FourthDimension 28 / 28 / 23 Регистрация: 06.10.2016 Сообщений: 74 |
||||
20.10.2016, 13:55 |
3 |
|||
Извините, не совсем понятно, что значит «специальные функции работы со строкой». Кликните здесь для просмотра всего текста
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 и прочее??
1 |
42 / 42 / 5 Регистрация: 25.03.2014 Сообщений: 444 |
|
20.10.2016, 16:52 [ТС] |
6 |
afront, я понимаю я просто уточнил, а ваш ник тоже попал под обстрел просто)
0 |
Как искать повторяющиеся слова в строке?
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 = ""; } } } } }