Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/856: Рейтинг темы: голосов - 856, средняя оценка - 4.66
 Аватар для mybabloo
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 40

Разделить строку на слова

23.02.2010, 14:30. Показов 176902. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем есть строка, и ее надо разбить на массив строк чтобы каждое слово было в ствоей строке.
Знаю что надо пользоваться strstr но в виду неопытности даже не знаю как сделать...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.02.2010, 14:30
Ответы с готовыми решениями:

Разделить строку на слова
Здравствуйте, подскажите как разделить текст на слова. Текст вводит пользователь и он записывается в string

Разделить строку на слова
char str = "We study C++ programming language first semester."; Есть такая строка, нужен очень простой способ разделить ее на...

Разделить строку на слова
Есть некая строка со словами: string stroka; И есть некоторая функция перегрузки: istream & operator >>(istream *...

14
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
23.02.2010, 14:42
Цитата Сообщение от mybabloo Посмотреть сообщение
Знаю что надо пользоваться strstr но в виду неопытности даже не знаю как сделать...
Что конкретно непонятно?
Вот синтаксис strstr (для C):
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
char *strstr(
   const char *str,
   const char *strSearch 
);
 
str
Null-terminated string to search.
 
strSearch
Null-terminated string to search for.
 
Return Value
Returns a pointer to the first occurrence of strSearch in str, or NULL if strSearch does 
not appear in str. If strSearch points to a string of zero length, the function returns str.
Т.е. str - строка, в которой производится поиск, strSearch - строка, которую ищешь. Функция возвращает указатель на первое вхождение строки strSearch в стоку str, NULL, если strSearch не появляется в stf. Если strSearch="", то возвращается указатель на str

Добавлено через 1 минуту
Только я бы здесь пользовался функцией find() класса string
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
23.02.2010, 15:05
Цитата Сообщение от mybabloo Посмотреть сообщение
В общем есть строка, и ее надо разбить на массив строк чтобы каждое слово было в ствоей строке.
C вариант
C
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
    
int main(void){
    char str[] = "blah blah blah", **words = NULL, *p = NULL;
    int i, cnt = 0;
    
    for ( p = strtok(str, " "); p != NULL; p = strtok(NULL, " ") ){
        if ( ( words = (char**)realloc(words, sizeof(char*) * (cnt + 1)) ) == NULL ){
            printf("No memory to new word!\n");
            exit(1);
        }
        if ( ( words[cnt] = strdup(p) ) == NULL ){
            printf("Can't duplicate word!\n");
            exit(1);
        }
        ++cnt;
    }
    
    printf("Words count: %d\n", cnt);
    
    for ( i = 0; i < cnt; ++i )
        printf("%s\n", words[i]);
        
    for ( i = 0; i < cnt; ++i ){
        if ( words[i] != NULL ){
            free(words[i]);
            words[i] = NULL;
        }
    }
    free(words);
    words = NULL;
    
    exit(0);
}
3
 Аватар для kazak
3604 / 2744 / 356
Регистрация: 11.03.2009
Сообщений: 6,306
23.02.2010, 15:11
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от mybabloo Посмотреть сообщение
В общем есть строка, и ее надо разбить на массив строк чтобы каждое слово было в ствоей строке.
Для этого применяется функция strtok
C++
1
char *strtok(char *s1, const char *s2);
где s1 - обрабатываемая строка,
s2 - список разделителей.
Пример использования:
имеется некоторая строка str, и указатель на char - buf, который будет указывать на отдельные слова
C++
1
2
3
4
5
6
buf = strtok(str, " .,!?\n");
while (buf)
{
   printf("%s\n", buf);
   buf = (NULL, " .,!?\n"); // здесь параметр NULL указывает, что мы ПРОДОЛЖАЕМ обрабатывать str
}
3
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
23.02.2010, 16:21
Лучший ответ Сообщение было отмечено как решение

Решение

На С++ интереснее
C++
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
#include <iostream>
#include <list>
#include <algorithm>
#include <functional>
#include <iterator>
#include <string>
#include <sstream>
    
int main(){
    std::string buf("raz dva tri");
    std::list<std::string> words;
    std::istringstream ist(buf);
    std::string tmp;
    while ( ist >> tmp )
        words.push_back(tmp);
    
    std::cout << "Unsorted:" << std::endl;
    std::copy(words.begin(), words.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    
    words.sort();
    std::cout << "Sorted ascendant:" << std::endl;
    std::copy(words.begin(), words.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    
    words.sort(std::greater<std::string>());
    std::cout << "Sorted descendant:" << std::endl;
    std::copy(words.begin(), words.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
    
    return 0;
}
4
3 / 3 / 0
Регистрация: 02.03.2010
Сообщений: 96
02.03.2010, 21:06
Подскажите как бы разделить строку на слова используя ssprintf?
0
6 / 6 / 0
Регистрация: 28.07.2010
Сообщений: 12
30.07.2010, 19:26
Задачка из этой же области.
Есть строка из команд:
$sdfsdf DPROfub Pdfsdf0sdf8e-r1|$sbgg DPRerdfsdwerwefw8e-r1|$go DPRerdfsdwerwefw8e-r1|
Команды разделены символом:
|
При этом команд в строке может быть неограниченное количество.
Нужно в цикле получить каждую команду и первое слово в ней.

Вот я делал так:

C++
1
2
3
4
5
6
7
8
9
10
11
pch = strtok (buf,"|"); // buf - содержет всю строку. pch получает первую команду
    while (pch != NULL) // Через цикл вынимаем все команды через строку (10)
    {
       printf ("--pch: %s\n",pch); // Выводится в цикле поочереди все команды
       pch2 = pch;
       pch2 = strtok (pch2, " ");
       printf ("--pch2: %s\n",pch2); // Выводится первое слово из команды
       pch2 = "";
 
       pch = strtok (NULL, "|"); // Должна вынуть следующую команду, но срабатывает на строку (6)
    }
Одна проблема, этот код не работает, т.к. получаются вложенные strtok и последняя строка (10)
pch = strtok (NULL, "|");
срабатывает на (6)
pch2 = strtok (pch2, " ")
, а дожна на (1)
pch = strtok (buf,"|");
чтобы получить следующую команду.

А нужно в результате получить такое:
--pch: $sdfsdf DPROfub Pdfsdf0sdf8e-r1
--pch2: $sdfsdf
--pch: $sbgg DPRerdfsdwerwefw8e-r1
--pch2: $sdfsdf
--pch: $go DPRerdfsdwerwefw8e-r1
--pch2: $sdfsdf
Подскажите простой способ реализовать.

Добавлено через 1 час 0 минут
Придумал другое решение, но не хватает навыка чтоб реализовать:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
buf = "$sdfsdf DPROfub Pdfsdf0sdf8e-r1|$sbgg DPRerdfsdwerwefw8e-r1|$go DPRerdfsdwerwefw8e-r1|";
char pch2[102] = {0}; // Для заполнения
int i,k,s;
k=0;
s=strlen(buf);
for (i=0;i<s;i++)
{       
    pch2[i] = buf[i]; // Записываем кажддый символ поочереди
    k++; // Считаем кол-во символов
 
    if (buf[i]=='|') // Если замечен разделитель - pch2 содержет команду полностью
    { 
       .... // Тут нужно создать новую переменную размером с k и поместить в неё всё из pch2....?
       .... // Выделяем первое слово полученной команды этим же способом....
       .... // Выводим команду и её первое слово на экран....
 
 
       k = 0 // Устанавливаем в 0 чтобы считать символы следующей команды
       //
    }
}
Помогите дописать..или может это неправильная реализация?
0
 Аватар для qwarta
73 / 73 / 11
Регистрация: 20.11.2009
Сообщений: 238
01.08.2010, 23:26
nail89, как один из вариантов,
C
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
#include <stdio.h>
#include <string.h>
 
int main (void)
{
   char buf[]="$sdfsdf DPROfub Pdfsdf0sdf8e-r1|$sbgg DPRerdfsdwerwefw8e-r1|$go DPRerdfsdwerwefw8e-r1|";
   char buf2[35],*ptr;
   int i;
    
   for(ptr = strtok(buf,"|"); ptr != NULL; ptr = strtok(NULL,"|"))
   {
    printf ("command: %s\n",ptr);
        strcpy(buf2,ptr);
        printf("word:");
        for(i=0;i<35;i++)
        {
        if(buf2[i] == ' ')
          break;
        else
          printf("%c",buf2[i]);
        }
        printf("\n------------------------\n");
   }
    
   return 0;
}
0
dsmirnov
04.10.2013, 18:05
Мой вариант на С:

C
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
56
#include <stdio.h>
#include <string.h>
#include <malloc.h>
 
char** parsedargs(int*, char*);
 
int main () {
    
    int i;
    char array_tmp[80];
    printf("> ");
    gets(array_tmp);
    
    int argc = 0;
    char **argv = parsedargs(&argc, array_tmp);
    for (i = 0; i < argc; ++i) {
        printf("%s\n", argv[i]);
    }
    
    for (i = 0; i < argc; ++i) {
        free(argv[i]);
    }
    free(argv);
    
    return 0;   
}
 
 char** parsedargs(int *argc, char *argv_tmp) {
    int i;
    char * p;
    for(i = 1; i < strlen(argv_tmp) + 1; ++i) {
        if(argv_tmp[i] == ' ' || argv_tmp[i] == '\0') {
            while(argv_tmp[i+1] == ' ') {
                i++;
            }
            *argc = *argc + 1;
        }
    }
    if (argv_tmp[strlen(argv_tmp) - 1] == ' ') {
        *argc = *argc - 1;
    }
    if (argv_tmp[0] == ' ') {
        *argc = *argc - 1;
    }
    
    char **argv = malloc((*argc + 1) * sizeof(char*));
    p = strtok (argv_tmp," ");
    i = 0;
    while (p != NULL) {
        argv[i++] = p;
        p = strtok (NULL, " ");
    }
    free(p);
    
    return argv;
}
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
27.02.2016, 20:02
6 IntelliSense: значение типа "void *" нельзя использовать для инициализации сущности типа "char **" c:\Users\user\Documents\Visual Studio 2012\Projects\ConsoleApplication8\Consol eApplication8\ConsoleApplication8.cpp 48 19 ConsoleApplication8
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
28.02.2016, 01:02
scherbakovss201, написано же
Мой вариант на С
ну хоть так:
C++
1
char **argv = (char**)malloc((*argc + 1) * sizeof(char*));
0
9 / 0 / 0
Регистрация: 16.02.2019
Сообщений: 67
24.04.2020, 01:16
я знаю что тему давно закрыли но хотел бы своим вариком поделится

C++
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 <windows.h>
#include <iostream>
#include <iostream>
#include <stdlib.h>
#include <conio.h>
#include <cstring>
#include <fstream>
#include <string>
#include <cctype>
#include <thread>
#include <time.h>
#include <ctime>
 
using namespace std;
 
void main()
{
    int i = 0;
    int count = 0;
    string s;
    char tmp[100];
 
    getline(cin, s);
 
    while (s[i])
    {
        if (islower(s[i]))
        {
            tmp[count] = s[i];
            count++;
        }
        if (s[i] == ' '&&count < 7)
        {
            count = 0;  
        }
        if (s[i] == ' '&&count > 6)
        {
            for (int u = 0; u < count; u++)
            {
                cout << tmp[u];
            }
            cout << endl;
            count = 0;
        }
        i++;
    }
    if (count > 6)
    {
        for (int u = 0; u < count; u++)
        {
            cout << tmp[u];
        }
        cout << endl;
    }
}
Добавлено через 35 минут
Цитата Сообщение от Dobrodeetel Посмотреть сообщение
я знаю что тему давно закрыли но хотел бы своим вариком поделится
извините - я забыл что тут нужно перекинуть слова в массив - эта прога просто выводит слова которые больше 7 символов
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
24.04.2020, 01:24
Если С++ то и так можно попробовать:
C++
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
#include <iostream>
#include <string>
#include <vector>
//possible implementation - просьба не кидаться тапками
namespace std
{
    vector<string> split(
                         const string &str,
                         const string &splitters=
                         "., ?!(){}[]\"\';:-=*+1234567890"
                         )
    {
        vector<string> result;
        string::size_type start(0), finish(0) ;
        while(finish!=string::npos)
        {
            while(splitters.find_first_of(str[start])!=string::npos)++start;
            if(start==string::npos) break;
            finish=str.find_first_of(splitters, start);
            result.emplace_back(str.substr(start, finish-start));
            if(finish==string::npos) break;
            start=finish;
        }
        return result;
    }
}
 
int main()
{
    std::string split_me_now=
    "Note that this class handles bytes independently of the encoding used:\
     If used to handle sequences of multi-byte or variable-length characters\
      (such as UTF-8), all members of this class\
       (such as length or size), as well as its iterators, will still operate\
        in terms of bytes (not actual encoded characters).\
      \'quotes'\ \"double quotes\" (parentheses) {braces} [square brackets] are\
      special alphabet characters and nothing to do with string a class as it is" ;
 
std::vector<std::string> words=std::split(split_me_now);
for(const auto &str:words)
    std::cout<<str<<std::endl;
return 0;
}
std::split - std::joke
0
9 / 0 / 0
Регистрация: 16.02.2019
Сообщений: 67
26.04.2020, 03:50
IGPIGP,
1 - нихера не понятно, но очень интересно
2 - почему не понятно? - я новичёк и половину кода не понял) не из-за читаемости - а из-за разных функций и того... чего не понял
3 - почему интересно? - нашел 2 вещи которые я не понял. если не трудно можете объяснить?
Цитата Сообщение от IGPIGP Посмотреть сообщение
namespace std
разве не должно писаться "using namespace std;"?
и далее вы всё равно используете std:: - а зачем?

в 6 строке открывается фигурная скобка... но где сама функция?
честно говря я даже вызова в main не увидел - я знаю я слепой

может я сильно придрялся и те вещи которые я упомянул - мелочи?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
26.04.2020, 09:33
Цитата Сообщение от Dobrodeetel Посмотреть сообщение
я новичёк и половину кода не понял) не из-за читаемости - а из-за разных функций и того... чего не понял
Dobrodeetel, этот текст не для новичков и тут я каюсь. Но вопрос топика концептуален и я решил предложить концепцию в стили С++. Она - лишь идея. Например в ней нет подсчета и резервирования. Заполнение происходит хоть и по emplace но с релокацией... Есть и другие нюансы. Но как схема, мне этот подход показался логичным. Для вас как новичка польза в том, чтобы скомпилировать, - посмотреть как оно работает и проникнуться горячим желанием всё это изучить. Через пару лет. Сходу не пытайтесь.
Цитата Сообщение от Dobrodeetel Посмотреть сообщение
разве не должно писаться "using namespace std;"?
и далее вы всё равно используете std:: - а зачем?
Это шутка. Вы можете сами добавить в этот namespace всё что угодно. Язык его не защищает. Но за такое нужно убивать. Я пошутил и не более.
Цитата Сообщение от Dobrodeetel Посмотреть сообщение
в 6 строке открывается фигурная скобка... но где сама функция?
Открытие блока это не всегда функция.
C++
1
2
3
4
int a(0);
{
int b(a);
}
вполне валидный код. Ф-скобки применяются в стнтаксисе составных операторов и блоков. Почитайте о неймспейсах не вникая пока глубоко. Достаточно будет понять, что вам предлагается гибкий инструмент, позволяющий составлять древовыдные структуры имён, где принвдлежность под-имени позиционно связана с именем в которое оно входит. Для борьбы с конфликтом имён это хороший способ управления именованием.
Цитата Сообщение от Dobrodeetel Посмотреть сообщение
может я сильно придрялся и те вещи которые я упомянул - мелочи?
Нет. Если непонятно - нужно спрашивать. Другим тоже будет интересно. Тем кто тоже не понял.
зы в std нужен лишь прототип)) Но шутка есть шутка)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.04.2020, 09:33
Помогаю со студенческими работами здесь

Разделить строку на слова
I. Данный указатель на строку “Ala ma kota, a kot ma ale”. Напишите программу, которая будет выполнять такие функции: • разделит строку...

Разделить строку на слова
Мне нужно по пробелу разделить строку на массив слов std::string s = &quot;баянист поплыл на батискаф&quot;;

Как разделить строку на слова?
Как разделить строку на слова? без использования функций

Как разделить строку на слова?
Помогите написать функцию для разбиения передаваемой строки на слова. Например дана строка: &quot;This is text, and it is black.&quot;. ...

Разделить строку на слова. Regex
Приветствую. Изучаю регулярки, хочу разделить строку на отдельные части используя regex. Как это правильно сделать? Из хочу получить ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru