Сортировка слов в одной строке в файле с помощью sort ()

#c #sorting

#c #сортировка

Вопрос:

Есть ли способ отсортировать слова по алфавиту, которые появляются в одной строке? Я знаю, что если у меня есть слова в новой строке, я могу легко отсортировать их с помощью:

 vector<string> file;
string line;
file.clear();
ifstream infile("foo.txt", ios_base::in);
infile.seekg(3);
while (getline(infile, line)){
    file.push_back(line);
}
sort(file.begin(), file.end());
ofstream outFile;
outFile.open("foo.txt");
for (const auto amp;e : file) outFile << e << "n";
  

Но что, если слова были в одной строке в файле (не разделенные пробелами), например: catapebat (cat ape bat). Есть ли простой способ сделать это на C ? Разве я не сделал getline бы это, поскольку я беру только одну строку? Как бы я подошел к этой проблеме?

Комментарии:

1. Чтобы ответить на заданный вопрос: да, есть простой способ сделать это на C .

2. У вас просто возникли проблемы с базовым кодированием, необходимым для сортировки слов в одной строке? Попытка разобрать слова, не разделенные пробелами, кажется отдельной (и более сложной) проблемой.

3. У вас есть слова без разделителей в одной строке, и вы хотите их прочитать? Допустим, вместо «cat», «ape» и «bat» в нем содержались «a» и «done». Без пробелов это adone , и затем может быть разделено по-другому как «ad» и «one». Что вы делаете в подобных неоднозначных случаях? Есть ли словарь допустимых слов?

4. Прямо сейчас моя проблема заключается в сортировке слов, которые появляются в одной строке. Я все еще пытаюсь понять, как я буду выполнять синтаксический анализ.

5. @apnorton моя проблема не в этом. Я ищу только записи определенной длины. Возможно, я мог бы просто разделить каждый третий символ?

Ответ №1:

  1. Используется getline для чтения строки.
  2. Создайте istringstream из строки, которую вы только что прочитали
  3. Считывать слова оттуда в vector<string>
  4. Сортировка слов в этом векторе

Ответ №2:

Я бы предложил получить словарь таких слов и сравнить каждое слово с началом строки. Если есть совпадение, вы удаляете это количество символов из начала строки и сохраняете слово в массиве. Повторяйте это, пока не получите массив, содержащий все слова, а затем отсортируйте массив по алфавиту.

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

Комментарии:

1. Как это будет относиться к таким словам, как «самолет» или «отменено», или ко многим другим словам, которые могут быть их собственным словом или частью более крупного слова?

2. Теоретически он будет считывать более крупное составное слово как 1 слово. Оптимальной стратегией было бы попробовать каждую комбинацию удачных слов. Например: «airplanesodapop» приведет к выводу: «воздух, самолет, газировка, поп» «самолет, газировка» «воздух, самолет, газировка» «воздух, самолет, газировка» «воздух, самолет, газировка» «воздух, самолет, газировка»