Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
 Аватар для Andrey040601
5 / 5 / 3
Регистрация: 13.07.2014
Сообщений: 129

Деление строки на слова

23.08.2015, 18:21. Показов 2950. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно, чтобы когда пользователь вводил что-то типа "integer a = 1", создавалась переменная a со значением 1.
Так вот как сделать такое считывание строки(из файла желательно), чтобы можно было разделить ее на слова и отдельно считать каждое слово?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.08.2015, 18:21
Ответы с готовыми решениями:

Деление строки на слова в файле
Здравствуйте! Надо разделить строки на слова и каждое слово поместить в массив слов. Когда читаю 1-ю строку файла, всё хорошо, но когда...

деление слова по слогам.
помогите пожалуйста может у кого нибудь есть или сможет помочь нужна программа которая бы делила слова на слога при этом ввод и вывод...

Вставить в строку попеременно четные слова строки S1 и нечетные слова строки S2
Здравствуйте, люди! Хочу попросить у вас помощи... Даны строки s1 и s2, содержащие по несколько слов. Сформировать строку S таким...

32
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
24.08.2015, 16:17
Студворк — интернет-сервис помощи студентам
Andrey040601, подождите, мисссстер Фриман. Попробую написать кое-что
0
 Аватар для Ваниль
5 / 5 / 1
Регистрация: 09.05.2013
Сообщений: 44
24.08.2015, 16:22
MicM, а у меня вот это (что, вроде бы, неправильно) сработало нормально:
C++
1
2
3
4
5
6
7
8
9
    char *a = new char[15]; 
    char *b = new char[15];
    a = "integer a = 1";
    b = strtok(a, " ");
 
    while (b != NULL){
        cout << b;
        b = strtok(NULL, " ");
    }
0
 Аватар для MicM
840 / 498 / 325
Регистрация: 29.12.2009
Сообщений: 1,106
24.08.2015, 16:45
Какой компилятор?
У меня g++ 4.8.4 вот, что выдает:
Bash
1
2
3
4
5
misha@Dell:~$ g++ file.cpp 
file.cpp: In function ‘int main()’:
file.cpp:9:7: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
     a = "integer a = 1";
       ^
Добавлено через 7 минут
Если написать так:
C++
1
const char *a = new char[15];
То уже будет ошибка:
Bash
1
2
3
4
5
6
7
8
9
10
misha@Dell:~$ g++ file.cpp 
file.cpp: In function ‘int main()’:
file.cpp:10:22: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]
     b = strtok(a, " ");
                      ^
In file included from /usr/include/c++/4.8/cstring:42:0,
                 from file.cpp:2:
/usr/include/string.h:348:14: error:   initializing argument 1 of ‘char* strtok(char*, const char*)’ [-fpermissive]
 extern char *strtok (char *__restrict __s, const char *__restrict __delim)
              ^
Добавлено через 10 минут
Коли уж динамически память выделяли, то лучше так писать
C++
1
strcpy (a, "integer a = 1");
Вместо
C++
1
a = "integer a = 1";
А то, выделить выделили, а не используете.
И потом не забывайте освобождать память:
C++
1
2
delete [] a;
delete [] b;
1
117 / 121 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
24.08.2015, 17:30
Andrey040601, вот, в общем. Код очень узкий: он вытянет имя и значение переменной. Оперировать ими как с встроенными переменными ("integer a = 2" => "int a = 2;" прямо в исходном коде) невозможно, так как таблица символов (читай: имен переменных) строится во время компиляции, и повлиять на нее во время выполнения невозможно (ИМХО).
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
#include <vector>
#include <map>
#include <iostream>
#include <sstream>
 
/* она разбивает строку на пробелы. Очень простой strtok. 
 * Если хотите, можете присобачить список ограничителей,
 * чтобы не только пробел был ограничителем. 
 * Возвращает вектор слов.          */
std::vector<std::string> 
    tokenize(std::string in)
{
    std::vector<std::string> vec;
    
    for(int i = 0; i < in.size(); ++i)
    {
        std::string temp = ""; 
        while(in[i] != ' ')
            temp += in[i++];
        vec.push_back(temp);            
    }
    
    return vec;
}
 
/* Создает пару <ИМЯ ПЕРЕМЕННОЙ, ЕЕ ЗНАЧЕНИЕ>. 
 * Потом можно добавить в словарь (map), чтобы 
 * потом иметь список разных переменных.
 */
template<class T>
std::pair<std::string, T> 
getVar(const std::vector<std::string>& vec)
{
    T variable;
    std::stringstream ss;
    ss << vec[3];
    ss >> variable;
    
    return std::pair<std::string, T>(vec[1], variable);
}
 
int main()
{
    std::string str = "int a = 12";
    std::map<std::string, int> one;
    auto a = getVar<int>(tokenize(str));    // а - пара <ИМЯ ПЕРЕМЕННОЙ, ЕЕ ЗНАЧЕНИЕ>
    
    std::cout << a.first << " " << a.second;
    
    // добавляем переменную в новое окружение int-переменных.
    one.insert(a);
}
0
3178 / 1937 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
24.08.2015, 17:54
Цитата Сообщение от Ваниль Посмотреть сообщение
Почему нет? Что может случиться?
RTFM !

strtok экономно разбивает строку In-Place, вставляя символ 0 (00h) вместо очередного разделителя (по сути, объявляя в этом месте EOS - конец строки). Разумеется, это невозможно проделать с константной строкой (компилятор поместит ее в отдельную секцию и загрузчик пометит эту страницу памяти как ReadOnly) - при попытке модификации получите сообщение об ошибке доступа по адресу blah-blah...
1
 Аватар для Andrey040601
5 / 5 / 3
Регистрация: 13.07.2014
Сообщений: 129
24.08.2015, 19:58  [ТС]
Я так делал:
C++
1
2
3
4
5
6
7
8
map<string, int>a;
 
string name;
int number;
 
cin >> name >> number;
 
a[name] = number;
Вот, что-то похожее на создание переменной есть
0
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
24.08.2015, 19:59
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
Нужно, чтобы когда пользователь вводил что-то типа "integer a = 1", создавалась переменная a со значением 1.
Так вот как сделать такое считывание строки(из файла желательно),
*/
#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <map>
#include <string>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string                             T_str;
typedef std::map        < T_str,    int     >   T_int_value_of_name;
typedef std::vector     < T_str             >   T_words;
/////////////////////////////////////////////////////////////////////////////////////////
bool    successfully_from_file_with_name_load_int_variables
    (
        T_str   const           &   filename,
        T_int_value_of_name     &   int_value_of_name
    )
{
    const   T_str   INT_TYPE_WORD   =   "integer";
    const   T_str   EQ_WORD         =   "=";
    T_words         words;
    std::ifstream   ifile( filename );
    bool            bool_res    =   !!ifile;
 
    if( bool_res )
    {
        std::copy
            (
                std::istream_iterator<T_str>    (ifile  ),
                std::istream_iterator<T_str>    (),
                std::back_inserter              ( words )
            );
 
        auto    it  =   words.begin();
 
        while   (
                        (
                            it  =   std::find
                                        (
                                            it,
                                            words.end(),
                                            INT_TYPE_WORD
                                        )
                        )
 
                    !=  words.end()
                )
        {
            bool_res    =   words.end() - it >= 4;
 
            if( bool_res )
            {
                auto    var_name    =   *++it;
                bool_res            =   *++it   ==  EQ_WORD;
 
                if( bool_res )
                {
                    try
                    {
                        int_value_of_name[ var_name ]   =   std::stoi( *++it );
                    }
                    catch(...)
                    {
                        bool_res    =   false;
                    }
                }//if
            }//if
 
            if( !bool_res )
            {
                return  bool_res;
            }
        }//while
    }//if
 
    return  bool_res;
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    const   T_str   FILENAME    =   "f.txt";
    std::locale::global(std::locale(""));
 
    for(;;)
    {
        std::ofstream   ofile( FILENAME );
        ofile   <<  "aaa integer   var  =  1AAAAA7777"
 
                <<  (
                        rand() % 2
                        ?   "bbb integer"
                        :   rand() % 2
                                ?   "bbb integer   var_var  ==  2 bbbb 7777"
                                :   rand() % 2
                                        ?   "bbb integer   var_var  =  _3 bbbb 7777"
                                        :   "bbb integer   var_var  =  4bbbb 7777"
                    )
 
                <<  std::endl;
 
        T_int_value_of_name   int_value_of_name;
 
        if  (
                !successfully_from_file_with_name_load_int_variables
                    (
                        FILENAME,
                        int_value_of_name
                    )
            )
        {
            std::cout   <<  "Некорректные данные в файле."
                        <<  std::endl;
        }
        else
        {
            std::for_each
                (
                    int_value_of_name.begin     (),
                    int_value_of_name.end       (),
 
                    []                          ( T_int_value_of_name::value_type   const   &   name_and_val )
                    {
                        std::cout   <<  name_and_val.first
                                    <<  "\t= "
                                    <<  name_and_val.second
                                    <<  std::endl;
                    }
                );
        }//else
 
        system("pause");
    }//for
}
0
 Аватар для Andrey040601
5 / 5 / 3
Регистрация: 13.07.2014
Сообщений: 129
24.08.2015, 20:19  [ТС]
Цитата Сообщение от MicM Посмотреть сообщение
C++
1
strcpy (a, "integer a = 1");
Теперь работает, спасибо
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.08.2015, 20:38
Цитата Сообщение от gazlan Посмотреть сообщение
strtok экономно разбивает строку In-Place, вставляя символ
вставляя

Потрясающе!! Как экономно.
0
3178 / 1937 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
24.08.2015, 22:26
Цитата Сообщение от hoggy Посмотреть сообщение
Потрясающе!! Как экономно.
Вы что-то не поняли? Требуются дополнительные пояснения?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
24.08.2015, 23:12
Цитата Сообщение от gazlan Посмотреть сообщение
Вы что-то не поняли? Требуются дополнительные пояснения?
я прекрасно понимаю, что strtok никуда ничего не вставляет.
0
3178 / 1937 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
24.08.2015, 23:50

Не по теме:

IMHO, выражение "вставляя ... вместо" не приводит к двусмысленности. Но если вы настаиваете на юридической точности, можете использовать подходящий синоним, например, "замещая".


Для этого примера на прикрепленном рисунке можно посмотреть как именно происходит замена.
Миниатюры
Деление строки на слова  
0
 Аватар для Ваниль
5 / 5 / 1
Регистрация: 09.05.2013
Сообщений: 44
25.08.2015, 09:24
Цитата Сообщение от MicM Посмотреть сообщение
Какой компилятор?
Builder XE4.

Цитата Сообщение от MicM Посмотреть сообщение
Коли уж динамически память выделяли, то лучше так писать
C++
1
strcpy (a, "integer a = 1");
Про грамотное выделение/освобождение периодически забываю, хотя знаю как надо (-х
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.08.2015, 09:24

Деление строки и вывод необходимого слова
Здравствуйте, уважаемые формучане. Я задался вопросом, а как же мне поделить строку и вывести необходимое слово. Допустим есть строка...

Деление слова по слогам
Добрый ночи! Помогите написать код, который бы делил слово на слоги. Чтобы каждый слог являлся бы вложенным списком, а само слово...

Вывести слова строки, которые отличны от последнего слова, и определить, есть ли в данной строке одинаковые слова
Дана строка, состоящая из слов, разделённых пробелами. Вывести слова этой строки, которые отличны от последнего слова. Определить, есть ли...

Напечатать все слова, отличные от последнего слова строки, удалив из каждого слова первую и последнюю буквы
Близиться сессия,а завтра мне сдавать 2 проги. Помогите ребят,могу даже 100 скинуть,если уж так трудно помочь. 8.Задан...

Строки. Напечатать те слова, которые отличны от первого слова и длина слова минимальна
Дана последовательность, содержащая от 2 до 50 слов, в каждом из которых от 1 до 8 строчных латинских букв; между соседними словами - не...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru