powered by simpleCommunicator - 2.0.28     © 2024 Programmizd 02
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как разбить строку на слова?
14 сообщений из 14, страница 1 из 1
Как разбить строку на слова?
    #40113339
Le0n41
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как разбить строку на слова и записать в массив только 4-х буквенные слова? Максимальная длина текста 250 символов. Разделителем считать пробел и запятую. Пользуясь <cstring> и избегая <vector>
...
Рейтинг: 0 / 0
Как разбить строку на слова?
    #40113342
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При таких условиях тебе нужен strtok().
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как разбить строку на слова?
    #40113348
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Le0n41,
Код: plaintext
1.
auto words = QString( u8"one two three four five" ).split( QRegExp("(\\s|,)+"), Qt::SkipEmptyParts );
...
Рейтинг: 0 / 0
Как разбить строку на слова?
    #40113382
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор ты можешь не плодить топики а просто продолжать первый, если это таже самая задача.
...
Рейтинг: 0 / 0
Как разбить строку на слова?
    #40113385
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вероятно это спамобот и следующим сообщением будет "ха-ха, вы все дураки, а
правильное решение на www.мойсуперсайт.нуждающийся.в.раскрутке.ру".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как разбить строку на слова?
    #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
Как разбить строку на слова?
    #40113400
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр СедовА вот если нельзя менять содержимое исходной строки (например если это строковый
литерал)

....то он заносится в std::string и становится доступным к менянию.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как разбить строку на слова?
    #40113422
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К черту strtok.
...
Рейтинг: 0 / 0
Как разбить строку на слова?
    #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
Как разбить строку на слова?
    #40113429
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да что за препод такие задания придумывает?
...
Рейтинг: 0 / 0
Как разбить строку на слова?
    #40113437
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton, а что плохого в этом задании? Написать простенький parser -- вполне нормальное задание. Если вы про это:
Le0n41
Пользуясь <cstring> и избегая <vector>
то может там смысл задания в том, чтобы научиться работать со строками в низкоуровневом, C-шном, стиле.
...
Рейтинг: 0 / 0
Как разбить строку на слова?
    #40113444
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пётр Седов,
в mfc стиле
...
Рейтинг: 0 / 0
Как разбить строку на слова?
    #40113463
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как разбить строку на слова?
    #40113480
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что, cstring и CString похожи до степени неразличимости?
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как разбить строку на слова?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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