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

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

23.02.2010, 14:30. Показов 176742. Ответов 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
3602 / 2743 / 355
Регистрация: 11.03.2009
Сообщений: 6,303
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
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 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
9005 / 4706 / 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
9005 / 4706 / 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
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru