Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.65/260: Рейтинг темы: голосов - 260, средняя оценка - 4.65
mybabloo
1 / 1 / 0
Регистрация: 29.12.2009
Сообщений: 40
1

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

23.02.2010, 14:30. Просмотров 48178. Ответов 10
Метки нет (Все метки)

В общем есть строка, и ее надо разбить на массив строк чтобы каждое слово было в ствоей строке.
Знаю что надо пользоваться strstr но в виду неопытности даже не знаю как сделать...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2010, 14:30
Ответы с готовыми решениями:

Разделить строку на слова
Есть некая строка со словами: string stroka; И есть некоторая функция...

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

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

Как разделить строку на слова?
Помогите написать функцию для разбиения передаваемой строки на слова. Например...

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

10
Nameless One
Эксперт С++
5786 / 3435 / 351
Регистрация: 08.02.2010
Сообщений: 7,448
23.02.2010, 14:42 2
Цитата Сообщение от mybabloo Посмотреть сообщение
Знаю что надо пользоваться strstr но в виду неопытности даже не знаю как сделать...
Что конкретно непонятно?
Вот синтаксис strstr (для C):
Код
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
easybudda
Модератор
Эксперт CЭксперт С++
10093 / 6003 / 1504
Регистрация: 25.07.2009
Сообщений: 11,387
23.02.2010, 15:05 3
Цитата Сообщение от 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
3058 / 2379 / 255
Регистрация: 11.03.2009
Сообщений: 5,438
Завершенные тесты: 1
23.02.2010, 15:11 4
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от 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
easybudda
Модератор
Эксперт CЭксперт С++
10093 / 6003 / 1504
Регистрация: 25.07.2009
Сообщений: 11,387
23.02.2010, 16:21 5
Лучший ответ Сообщение было отмечено как решение

Решение

На С++ интереснее
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
San4oPanso
2 / 2 / 0
Регистрация: 02.03.2010
Сообщений: 96
02.03.2010, 21:06 6
Подскажите как бы разделить строку на слова используя ssprintf?
0
nail89
5 / 5 / 0
Регистрация: 28.07.2010
Сообщений: 12
30.07.2010, 19:26 7
Задачка из этой же области.
Есть строка из команд:
$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 8
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
0 / 0 / 0
Регистрация: 01.10.2013
Сообщений: 1
04.10.2013, 18:05 9
Мой вариант на С:

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;
}
0
scherbakovss201
15 / 6 / 16
Регистрация: 22.12.2015
Сообщений: 1,610
27.02.2016, 20:02 10
6 IntelliSense: значение типа "void *" нельзя использовать для инициализации сущности типа "char **" c:\Users\user\Documents\Visual Studio 2012\Projects\ConsoleApplication8\ConsoleApplication8\ConsoleApplication8.cpp 48 19 ConsoleApplication8
0
Croessmah
++Ͻ
14611 / 8365 / 1576
Регистрация: 27.09.2012
Сообщений: 20,561
Записей в блоге: 2
Завершенные тесты: 1
28.02.2016, 01:02 11
scherbakovss201, написано же
Мой вариант на С
ну хоть так:
C++
1
char **argv = (char**)malloc((*argc + 1) * sizeof(char*));
0
28.02.2016, 01:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.02.2016, 01:02

Разделить строку на слова, используя указатели
Помогите, пожалуйста, сделать программу. Ввести произвольное предложение с...

Разделить строку AnsiString на слова и записать их в массив!
Доброго времени суток, что не так? char lecs; for (i=0;i&lt;1;i++) { ...

Прочитать строку из файла, разделить слова и вывести количество символов
Написал программу, которая должна прочитать строку из файла, разделить слова и...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru