0 / 0 / 0
Регистрация: 13.09.2016
Сообщений: 9
1

Функция разделения строки на лексемы strtok

15.12.2016, 22:07. Показов 2655. Ответов 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
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
#include "stdafx.h"
#include <iostream> 
#include <windows.h>
 
using namespace std; 
 
int tran (char c1, char c2)
{
    switch (c1) 
    {
        case 'о':
          return 1;
          break;
        case 'д':
            if (c2=='в')
                return 2;
            else
                return 9;
            break;
        case 'т':
            return 3;
            break;
        case 'ч':
            return 4;
            break;
        case 'п':
            if (c2=='я')
                return 5;
            else
                return 12; //плюс
            break;
        case 'ш':
            return 6;
            break;
        case 'с':
            return 7;
            break;
        case 'в':
            return 8;
            break;
        case 'м':
            return 13; //минус
            break;
        default:
          return 100; //ошибка
          break;
    }
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0,"rus");
    SetConsoleCP ( 1251 ) ;
    SetConsoleOutputCP ( 1251 ) ;
    int x0,a,b,res=0;
    char c1,c2;
    char in[255];
    cout<<" Введите строку: "<<endl;
    cin.get(in,255);
    char * pch = strtok (in," "); 
    c1 = pch[0];
    c2 = pch[1];
    x0 = tran(c1,c2);
    while (pch != NULL)                        
    {
            
            pch = strtok (NULL, " ");
            c1 = pch[0];
            c2 = pch[1];
            a = tran(c1,c2); //знак
 
            pch = strtok (NULL, " ");
            c1 = pch[0];
            c2 = pch[1];
            b = tran(c1,c2); //цифра
 
 
            if (a==12)
                res = x0 + b;
            else if (a==13)
                res = x0 - b;
            x0 = res;
    }
    cout<<endl<<"Результат: "<<res<<endl;
    system("pause");
    return 0;
}
При компиляции выскакивает эксепшн:
Знаю, что косяк в функции strtok, внутри цикла, мб читаю того, что нет. Не могу разобраться.
Проверил функцию tran на отдельных символах, всё работает.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.12.2016, 22:07
Ответы с готовыми решениями:

Разделение строки на лексемы с strtok, проверка длины каждой лексемы (выдает ошибку)
я именно вот разделяю строку на лексемы и хочу проверить длину каждой лексемы, потом выполнить...

после strtok записать лексемы в массив
файл input.txt содежит 2 строки: 10 1 2 3 6 3 3 2 2 1 1 Код: #include &lt;iostream&gt; #include...

Функция разделения строки в массив отдельных частей этой строки
Помогите написать функцию, которая на вход принимает строку типа String и возвращает уже массив...

Использование STRTOK Разбить строку на слова, из слов составить список C++ Функция strtok
Задача Дана строка слов с разделителями, в данном примере слова с пробелами Нужно, используя...

5
7347 / 6273 / 2852
Регистрация: 14.04.2014
Сообщений: 27,180
15.12.2016, 23:19 2
Отладчик что показывает? c1 и c2 - лишние, сразу используй pch.
0
0 / 0 / 0
Регистрация: 13.09.2016
Сообщений: 9
15.12.2016, 23:28  [ТС] 3
да, было без них, просто во время отладки шаманил.
Миниатюры
Функция разделения строки на лексемы strtok  
0
7347 / 6273 / 2852
Регистрация: 14.04.2014
Сообщений: 27,180
15.12.2016, 23:43 4
Лучший ответ Сообщение было отмечено TheYak73 как решение

Решение

После строк 67 и 72 вставь проверку pch на NULL.
Надо отладчиком пошагово смотреть.
0
0 / 0 / 0
Регистрация: 13.09.2016
Сообщений: 9
15.12.2016, 23:56  [ТС] 5
Спасибо, добавил в указанные места
C++
1
2
if (pch == NULL)
    break;
И всё заробило
0
113 / 111 / 62
Регистрация: 15.03.2013
Сообщений: 561
Записей в блоге: 5
16.12.2016, 00:04 6
в 81ю строку добавьте
C++
1
pch = strtok(NULL, " ");
Добавлено через 1 минуту
хм.... у меня только с моим дополнением заработало
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.12.2016, 00:04
Помогаю со студенческими работами здесь

Функция strtok. Представление телефонного номера в виде строки.
Запутался в функции strtok. Причем уже сделал для неё пару упражнений, вроде понимаю как она...

Посмотрите код! (используя функцию strtok, разбить телефонный номер формата (555) 555-5555, введенный как строку, на лексемы)
Посмотрите код все правильно ли??? Задание звучит так, используя функцию strtok, разбить телефонный...

функция strtok
расскажите алгоритм char str =&quot;- This, a sample string.&quot;; char * pch; printf (&quot;Splitting...

Функция strtok()
Доброе время суток! Подскажите пожалуйста в чем проблема и как с ней бороться. Имеем такой...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru