Гость
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как разбить строку на слова? / 14 сообщений из 14, страница 1 из 1
20.11.2021, 15:13
    #40113339
Le0n41
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как разбить строку на слова?
Как разбить строку на слова и записать в массив только 4-х буквенные слова? Максимальная длина текста 250 символов. Разделителем считать пробел и запятую. Пользуясь <cstring> и избегая <vector>
...
Рейтинг: 0 / 0
20.11.2021, 15:28
    #40113342
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как разбить строку на слова?
При таких условиях тебе нужен strtok().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.11.2021, 16:01
    #40113348
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как разбить строку на слова?
Le0n41,
Код: plaintext
1.
auto words = QString( u8"one two three four five" ).split( QRegExp("(\\s|,)+"), Qt::SkipEmptyParts );
...
Рейтинг: 0 / 0
20.11.2021, 19:08
    #40113382
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как разбить строку на слова?
Автор ты можешь не плодить топики а просто продолжать первый, если это таже самая задача.
...
Рейтинг: 0 / 0
20.11.2021, 19:13
    #40113385
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как разбить строку на слова?
Вероятно это спамобот и следующим сообщением будет "ха-ха, вы все дураки, а
правильное решение на www.мойсуперсайт.нуждающийся.в.раскрутке.ру".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.11.2021, 19:38
    #40113398
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как разбить строку на слова?
Le0n41, если допускается менять содержимое исходной строки, то действительно можно использовать стандартную функцию strtok:
Код: plaintext
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.
#include <cassert>
#include <cstring> // то же самое, что <string.h>, только надо ещё писать «std::» перед именами стандартных функций, например «std::strlen»
#include <cstdio>

using namespace std; // чтобы не писать «std::»

const int _max_text_len = 250;
const int _short_word_len = 4;
const int _max_short_words_count = _max_text_len / (_short_word_len + 1);

struct short_word_t {
  char* elems;
};

short_word_t _short_words[_max_short_words_count];
int _short_words_count;

void get_words(char* text) {
  assert(strlen(text) <= _max_text_len);
  const char* const separators = " ,";
  _short_words_count = 0;
  for (char* word = strtok(text, separators); word != NULL; word = strtok(NULL, separators)) {
    if (strlen(word) == _short_word_len) {
      // добавляем короткое слово в массив
      assert(_short_words_count < _max_short_words_count);
      _short_words[_short_words_count].elems = word;
      _short_words_count++;
    }
  }
}

int main() {
  char text[] = "veni, vidi, vici"; // в массив text копируется содержимое строкового литерала
  get_words(text); // меняет содержимое массива text
  for (int i = 0; i < _short_words_count; i++) {
    printf("%s\n", _short_words[i].elems);
  }
  return 0;
}

Но strtok «портит» исходную строку, записывая туда нулевые элементы '\0', чтобы разбить текст на слова. А вот если нельзя менять содержимое исходной строки (например если это строковый литерал), то можно своим кодом разбить строку на слова:
Код: plaintext
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.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
#include <cassert>
#include <cstring>
#include <cstdio>

using namespace std;

const int _max_text_len = 250;
const int _short_word_len = 4;
const int _max_short_words_count = _max_text_len / (_short_word_len + 1);

struct short_word_t {
  const char* elems; // не завершается нулевым элементом '\0'
};

short_word_t _short_words[_max_short_words_count];
int _short_words_count;

void get_words(const char* text) {
  assert(strlen(text) <= _max_text_len);
  _short_words_count = 0;
  int pos = 0;
  for (;;) {
    // пропускаем пробелы и запятые
    while ((text[pos] == ' ') || (text[pos] == ',')) {
      pos++;
    }

    if (text[pos] == '\0') { // если дошли до конца текста
      break;
    }

    // сканируем слово
    int word_start = pos;
    do {
      pos++;
    } while ((text[pos] != ' ') && (text[pos] != ',') && (text[pos] != '\0'));
    const char* word = text + word_start;
    int word_len = pos - word_start;

    if (word_len == _short_word_len) {
      // добавляем короткое слово в массив
      assert(_short_words_count < _max_short_words_count);
      _short_words[_short_words_count].elems = word;
      _short_words_count++;
    }
  }
}

int main() {
  get_words("veni, vidi, vici");
  for (int i = 0; i < _short_words_count; i++) {
    printf("%.*s\n", _short_word_len, _short_words[i].elems);
  }
  return 0;
}


mayton
Автор ты можешь не плодить топики а просто продолжать первый, если это таже самая задача.
Почему та же самая? Там максимальная длина строки была 200 элементов, а тут 250 элементов. Это уже получается другая задача :).
...
Рейтинг: 0 / 0
20.11.2021, 19:40
    #40113400
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как разбить строку на слова?
Пётр СедовА вот если нельзя менять содержимое исходной строки (например если это строковый
литерал)

....то он заносится в std::string и становится доступным к менянию.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
20.11.2021, 21:25
    #40113422
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как разбить строку на слова?
К черту strtok.
...
Рейтинг: 0 / 0
20.11.2021, 21:29
    #40113424
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как разбить строку на слова?
Dimitry Sibiryakov, да, можно и так. Я просто не люблю parsing, который «портит» исходную строку. Хотя есть например pugixml, скоростной XML parser, и там есть возможность использовать исходную строку для хранения каких-то данных:
https://pugixml.org/docs/quickstart.html
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
// You can use load_buffer_inplace to load document from mutable memory block; the block's lifetime must exceed that of document
char* buffer = new char[size];
memcpy(buffer, source, size);

// The block can be allocated by any method; the block is modified during parsing
pugi::xml_parse_result result = doc.load_buffer_inplace(buffer, size);

// You have to destroy the block yourself after the document is no longer used
delete[] buffer;
...
Рейтинг: 0 / 0
20.11.2021, 21:38
    #40113429
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как разбить строку на слова?
Да что за препод такие задания придумывает?
...
Рейтинг: 0 / 0
20.11.2021, 21:51
    #40113437
Пётр Седов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как разбить строку на слова?
mayton, а что плохого в этом задании? Написать простенький parser -- вполне нормальное задание. Если вы про это:
Le0n41
Пользуясь <cstring> и избегая <vector>
то может там смысл задания в том, чтобы научиться работать со строками в низкоуровневом, C-шном, стиле.
...
Рейтинг: 0 / 0
20.11.2021, 22:15
    #40113444
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как разбить строку на слова?
Пётр Седов,
в mfc стиле
...
Рейтинг: 0 / 0
21.11.2021, 01:44
    #40113463
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как разбить строку на слова?
...
Рейтинг: 0 / 0
21.11.2021, 10:21
    #40113480
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как разбить строку на слова?
А что, cstring и CString похожи до степени неразличимости?
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как разбить строку на слова? / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]