Поиск совпадения в массиве с помощью strcmp

я пытаюсь сравнить слова массива с помощью strcmp. Я пытаюсь получить каждое слово, которое появляется в массиве более одного раза, для печати только один раз, поэтому я могу определить количество уникальных слов. Я знаю, что он делает неправильно, когда он ищет массив, он выводит каждую найденную копию, например, если слово «the» находится в массиве 4 раза, оно будет выводить «the» 3 раза, и когда string1 переходит к следующему месту, где находится «the», оно распечатает 2 раза и так далее.


person Bob the builder    schedule 18.09.2011    source источник
comment
Боб-строитель! Может ли он это исправить? Боб-строитель! Нет, он не может :(   -  person flight    schedule 18.09.2011
comment
Два вопроса: 1. Почему этот вопрос отмечен тегом «cstring»? 2. Почему вы используете strcmp() для сравнения строк в C++? У std::string прекрасное operator ==!   -  person Johnsyweb    schedule 18.09.2011
comment
я не хочу использовать строковые объекты для этой программы   -  person Bob the builder    schedule 18.09.2011
comment
Этот код не имеет смысла для меня. Я предлагаю использовать более описательные имена переменных.   -  person Johnsyweb    schedule 18.09.2011
comment
@Bob the builder: Что не так с std::string? Вы пишете C++!   -  person Johnsyweb    schedule 18.09.2011
comment
еще вопрос, как объявляется string1[]? ваша строка для ( x = 0;x ‹= 15;x++) выглядит немного подозрительно, так как распространенная ошибка состоит в том, чтобы написать ‹=, когда это должно было быть ‹, если вы объявили это string1[15]   -  person AndersK    schedule 18.09.2011
comment
он объявлен как этот... char string1[16] =   -  person Bob the builder    schedule 18.09.2011
comment
@Anders K: Это хороший вопрос. Похоже, что words — это 2D-массив char*, что делает string1 похожим на массив char*, а вызов strlen(string1) очень сомнительным. std::string, безусловно, подходит для этого (в сочетании с std::set для изоляции уникальных записей, как это предлагается в ответ Бенджамина.   -  person Johnsyweb    schedule 18.09.2011
comment
@Bob the builder: Было бы очень полезно предоставить все объявления в вашем коде. Это задание тоже выглядит сомнительно.   -  person Johnsyweb    schedule 18.09.2011
comment
хорошо, это назначение указывает, что я не могу использовать строковые объекты С++   -  person Bob the builder    schedule 18.09.2011
comment
Ах... классическое домашнее задание с уникальными словами, а?   -  person Johnsyweb    schedule 18.09.2011
comment
char string1[16] = .каждое слово имеет длину не более 16 символов   -  person Bob the builder    schedule 18.09.2011
comment
Что происходит, когда в вашем файле есть слово «пьезоэлектрически»?   -  person Johnsyweb    schedule 18.09.2011
comment
давайте притворимся ради аргументов, что каждое слово состоит не более чем из 16 символов   -  person Bob the builder    schedule 18.09.2011
comment
@quasiverse: Боб Строитель — психопат. Если вы не будете осторожны, он может взять с собой бензопилу в гости к вам домой.   -  person Mateen Ulhaq    schedule 18.09.2011
comment
Боб, все в порядке, если вы хотите использовать для этого строки и функции в стиле C в качестве возможности обучения или потому, что у вас нет выбора. Однако вы пометили вопрос как C ++. Естественно, люди будут предлагать строки, контейнеры и алгоритмы C++, потому что это сделало бы решение проблемы тривиальным.   -  person Blastfurnace    schedule 18.09.2011


Ответы (2)


хорошо, что вы добавили объявления,

теперь из того, что выглядит, кажется, что words[][] является излишним и делает вещи ненужными. если вы заинтересованы только в получении уникальных слов, вместо этого просто обработайте то, что возвращается от strtrok, создав словарь с встречающимися словами

словарь может быть чем-то таким же простым, как массив максимального размера, содержащий уникальные слова, и индекс, начинающийся с 0, когда массив пуст, всякий раз, когда strtok возвращает слово, просматривайте массив и ищите слово, используя ваш strcmp, если это не так не существует, добавьте его в конец массива, затем увеличьте, а затем индексируйте.

а Боб твой дядя :)

person AndersK    schedule 18.09.2011
comment
Моим единственным предложением будет связанный список вместо большого массива. - person mange; 18.09.2011
comment
так вы говорите, что я загружаю массив со всеми словами и сравниваю его с тем, что возвращает strok? - person Bob the builder; 18.09.2011

Преобразуйте свои массивы символов в std::string и вместо того, чтобы печатать их, поместите их в std::set. Затем распечатайте каждый элемент набора.

person Benjamin Lindley    schedule 18.09.2011
comment
я не могу использовать строковый объект для этой программы - person Bob the builder; 18.09.2011
comment
Отличный ответ, если он сможет его понять. Однако я сомневаюсь, что он знает, как использовать std::string, не говоря уже о std::set. - person flight; 18.09.2011
comment
@Боб: Почему? Если вы собираетесь наложить на себя произвольные ограничения, то я проголосую за то, чтобы закрыть ваш вопрос как «слишком локализованный», потому что это не настоящая проблема, с которой когда-либо сталкивался программист на C++. - person Benjamin Lindley; 18.09.2011
comment
char string1[16] = .каждое слово имеет длину не более 16 символов – - person Bob the builder; 18.09.2011
comment
@Bob: Это не гарантирует, что ваши слова состоят всего из 16 символов, это просто приводит к нарушению прав доступа при их переходе. С помощью std::string вы не получите нарушений прав доступа, если он будет превышен, и вы можете безопасно проверить длину и предпринять любые необходимые корректирующие действия. - person Benjamin Lindley; 18.09.2011
comment
я читаю из файла, который имеет максимум 16 символов, включая завершающий символ, поэтому выход за борт не является проблемой - person Bob the builder; 18.09.2011
comment
@Боб: Хорошо. Тогда я не понимаю цели вашего предыдущего комментария. - person Benjamin Lindley; 18.09.2011
comment
@Bob строитель: «конечный символ»? Что это в текстовом файле? - person Johnsyweb; 18.09.2011