Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 150
1

Особенности while (pch != NULL)

23.09.2015, 01:10. Показов 1882. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Подскажите, почему пример ниже завершается ошибкой? Ведь если pch == NULL, то запись в вектор не должна производиться?
В массиве char str[] есть непечатные символы, которые тут не отображаются, но как я понимаю, проблема не в этом.
Мне нужно записать элементы массива в структуру, на свои места, но у меня пока не получатся даже запись в вектор.
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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <cstdlib>
#include <stdio.h>
#include <vector>
 
using namespace std;
 
struct glass//структура под данные из стаканов
{
    vector <float> BID_PRICE;
    vector <unsigned int> BID_QUANTITY;//спрос цена увеличивается от первого значения
    vector <float> OFFER_PRICE;
    vector <unsigned int> OFFER_QUANTITY;//предложение цена увеличивается от первого значения
};
 
struct glass STAKAN;
//vector<glass> all_STAKANS;
vector<string> temp_vector;
 
void main()
{
    const char separator[] = "=\01\02\03\04"; //Символы-разделители строки
    char str[] = "BID_COUNT=20.000000OFFER_COUNT=20.000000BID=PRICE=139.820000QUANTITY=1062.000000PRICE=139.830000QUANTITY=2.000000PRICE=139.850000QUANTITY=9.000000PRICE=139.870000QUANTITY=1.000000PRICE=139.880000QUANTITY=1.000000PRICE=139.900000QUANTITY=54.000000PRICE=139.910000QUANTITY=1.000000PRICE=139.920000QUANTITY=1.000000PRICE=139.930000QUANTITY=4.000000PRICE=139.940000QUANTITY=1.000000PRICE=139.970000QUANTITY=1.000000PRICE=139.980000QUANTITY=1.000000PRICE=140.000000QUANTITY=17.000000PRICE=140.010000QUANTITY=301.000000PRICE=140.020000QUANTITY=400.000000PRICE=140.040000QUANTITY=2.000000PRICE=140.050000QUANTITY=1.000000PRICE=140.060000QUANTITY=320.000000PRICE=140.070000QUANTITY=1.000000PRICE=140.100000QUANTITY=2787.000000OFFER=PRICE=140.120000QUANTITY=23.000000PRICE=140.150000QUANTITY=7.000000PRICE=140.200000QUANTITY=19.000000PRICE=140.260000QUANTITY=106.000000PRICE=140.290000QUANTITY=20.000000PRICE=140.300000QUANTITY=100.000000PRICE=140.310000QUANTITY=400.000000PRICE=140.320000QUANTITY=20.000000PRICE=140.350000QUANTITY=50.000000PRICE=140.400000QUANTITY=20.000000PRICE=140.420000QUANTITY=400.000000PRICE=140.480000QUANTITY=150.000000PRICE=140.500000QUANTITY=40.000000PRICE=140.520000QUANTITY=440.000000PRICE=140.550000QUANTITY=270.000000PRICE=140.580000QUANTITY=3.000000PRICE=140.670000QUANTITY=10.000000PRICE=140.680000QUANTITY=10.000000PRICE=140.700000QUANTITY=10.000000PRICE=140.720000QUANTITY=80.000000";
    char* pch;
    printf("Splitting string \"%s\" into tokens:\n", str);
    pch = strtok(str, separator);
    while (pch != NULL)
    {
        printf("%s\n", pch);
        pch = strtok(NULL, separator);
        temp_vector.push_back(pch);
        //if (pch != "BID_COUNT")// || pch == "OFFER_COUNT")
        //{
        //}
    }
}
Особенности while (pch != NULL)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.09.2015, 01:10
Ответы с готовыми решениями:

В чём разница между pch.h и stdfx.h
Недавно переустановил Windows и возникла проблема. Когда заново установил visuals studio,то пропал...

Не работает код: m_web1.Navigate ('gidro.htm',0,0,NULL,NULL);
Друзья помогите начинаюшему значит делаю m_web1.Navigate ('с:\gidro.htm',0,0,NULL,NULL);работает...

Блин, для ЧЕГО НУЖНА Функция CREATE TABLE invoice( inv_id INT AUTO_INCREMENT NOT NULL , usr_id INT NOT NULL , prod_id INT NOT NULL , quantity INT NOT
Погуглив, так и не смог толком понять. Есть тут ГУРУ по mysql Которые могут на пальцах или на...

Греется диод PCH
Здравствуйте. Ноутбук Clevo w150er (Покупался под названием DNS (0164800) (HD+)) Проблема:...

9
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 150
23.09.2015, 01:21  [ТС] 2
Не правильно выразился выше, запись в вектор получается, но завершается ошибкой почему-то.
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
23.09.2015, 01:23 3
C++
1
2
3
pch = strtok(NULL, separator);
if ( pch != 0 )
    temp_vector.push_back(pch);
1
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 150
23.09.2015, 02:05  [ТС] 4
Croessmah, Спасибо!
Да действительно, так всё работает, без ошибок. Но я не могу понять, почему выполнение программы доходит до temp_vector.push_back(pch);
через этот оператор
while (pch != NULL)
почему не прекращается выполнение цикла по условию pch != NULL?

Ведь оператор
if ( pch != 0 )
повторяет условие которое записано в операторе цикла...
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
23.09.2015, 02:12 5
Лучший ответ Сообщение было отмечено russian_pepper как решение

Решение

Цитата Сообщение от russian_pepper Посмотреть сообщение
Да действительно, так всё работает, без ошибок. Но я не могу понять, почему выполнение программы доходит до
C++
1
2
3
4
5
6
    while (pch != NULL)//Не ноль, тогда выполняем цикл
    {
        pch = strtok(NULL, separator);//Если здесь strtok вернул ноль, то
        temp_vector.push_back(pch);//здесь будет ошибка
        //а уж если дошли до сюда, то возвращаемся к началу цикла и проверяем условие.
    }
1
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
23.09.2015, 09:58 6
Подозреваю, что всего лишь перепутаны местами строки 32 и 33 в программе из первого поста
1
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 150
23.09.2015, 15:32  [ТС] 7
Evg, Да, действительно, так красивее и логичнее и правильнее, но теперь
не могу понять, почему в таком варианте программы, в консоль, надпись "pch = PRICE" не выводится ни разу, хотя значение "PRICE" присваивается pch и даже записывается в вектор temp_vector. Не подскажете, почему так?
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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <cstdlib>
#include <stdio.h>
#include <vector>
 
using namespace std;
 
struct glass//структура под данные из стаканов
{
    vector <string> BID_PRICE;
    vector <unsigned int> BID_QUANTITY;//спрос цена увеличивается от первого значения
    vector <float> OFFER_PRICE;
    vector <unsigned int> OFFER_QUANTITY;//предложение цена увеличивается от первого значения
};
 
struct glass STAKAN;
//vector<glass> all_STAKANS;
vector<string> temp_vector;
 
void main()
{
    const char separator[] = "=\01\02\03\04"; //Символы-разделители строки
    char str[] = "BID_COUNT=20.000000OFFER_COUNT=20.000000BID=PRICE=139.820000QUANTITY=1062.000000PRICE=139.830000QUANTITY=2.000000PRICE=139.850000QUANTITY=9.000000PRICE=139.870000QUANTITY=1.000000PRICE=139.880000QUANTITY=1.000000PRICE=139.900000QUANTITY=54.000000PRICE=139.910000QUANTITY=1.000000PRICE=139.920000QUANTITY=1.000000PRICE=139.930000QUANTITY=4.000000PRICE=139.940000QUANTITY=1.000000PRICE=139.970000QUANTITY=1.000000PRICE=139.980000QUANTITY=1.000000PRICE=140.000000QUANTITY=17.000000PRICE=140.010000QUANTITY=301.000000PRICE=140.020000QUANTITY=400.000000PRICE=140.040000QUANTITY=2.000000PRICE=140.050000QUANTITY=1.000000PRICE=140.060000QUANTITY=320.000000PRICE=140.070000QUANTITY=1.000000PRICE=140.100000QUANTITY=2787.000000OFFER=PRICE=140.120000QUANTITY=23.000000PRICE=140.150000QUANTITY=7.000000PRICE=140.200000QUANTITY=19.000000PRICE=140.260000QUANTITY=106.000000PRICE=140.290000QUANTITY=20.000000PRICE=140.300000QUANTITY=100.000000PRICE=140.310000QUANTITY=400.000000PRICE=140.320000QUANTITY=20.000000PRICE=140.350000QUANTITY=50.000000PRICE=140.400000QUANTITY=20.000000PRICE=140.420000QUANTITY=400.000000PRICE=140.480000QUANTITY=150.000000PRICE=140.500000QUANTITY=40.000000PRICE=140.520000QUANTITY=440.000000PRICE=140.550000QUANTITY=270.000000PRICE=140.580000QUANTITY=3.000000PRICE=140.670000QUANTITY=10.000000PRICE=140.680000QUANTITY=10.000000PRICE=140.700000QUANTITY=10.000000PRICE=140.720000QUANTITY=80.000000";
    char* pch;
    printf("Splitting string \"%s\" into tokens:\n", str);
    pch = strtok(str, separator);
    while (pch != NULL)
    {
        printf("%s\n", pch);
        temp_vector.push_back(pch);
        pch = strtok(NULL, separator);
        if (pch == "PRICE")
        {
            cout << "pch = PRICE" << endl;
        }
    }
}
Здесь есть управляющие символы, которые невидны, по ссылке ниже исходный cpp файл

https://drive.google.com/open?... 1lfblZNOFk
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
23.09.2015, 15:43 8
Цитата Сообщение от russian_pepper Посмотреть сообщение
не могу понять, почему в таком варианте программы, в консоль, надпись "pch = PRICE" не выводится ни разу, хотя значение "PRICE" присваивается pch и даже записывается в вектор temp_vector.
Ну ответ же очевиден и точно такой же, как и в прошлый раз. Между "хотя значение PRICE присваивается pch и даже записывается в вектор temp_vector" и "if (pch == PRICE)" стоит модификация переменной pch. Т.е. твой код эквивалентен:

C
int x, y;
x = 1;
printf ("%d\n", x); /* увидели печать, что x=1 */
x = 10;
y = x; /* почему-то основываясь на печати делаем вывод, что y=1 */
Добавлено через 2 минуты
Ну и к слову. Почти все интерфейсы поиска спроектированы так, чтобы пользоваться ими в цикле for:

C
for (pch = strtok(str, separator); pch != NULL; pch = strtok(NULL, separator))
{
  ...
}
При таком раскладе ты хотя бы не будешь наступать на эти же самые грабли (модификация pch должна быть в самом конце тела цикла, а у тебя опять посередине)

Добавлено через 1 минуту
C
if (pch == "PRICE")
В языке Си строки надо сравнивать через strcmp. Хоть ты и используешь Си++, но строки у тебя в виде char*, а потому нужно использовать strcmp
1
44 / 1 / 0
Регистрация: 14.06.2014
Сообщений: 150
23.09.2015, 15:47  [ТС] 9
Evg, Да, действительно, я поторопился, но так тоже не работает, как ожидал:
C++
1
2
3
4
5
6
7
8
9
        printf("%s\n", pch);
        temp_vector.push_back(pch);
        
        if (pch == "PRICE")
        {
            cout << "pch = PRICE" << endl;
        }
        pch = strtok(NULL, separator);
    }
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
23.09.2015, 16:28 10
У Вас сравниваются указатели. Используйте strcmp, например
C++
1
2
3
4
if ( !strcmp(pch,"PRICE") )
{
//...
}
1
23.09.2015, 16:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.09.2015, 16:28
Помогаю со студенческими работами здесь

Максимальная температура моста Pch?
какая макс. критич. темп. моста мат платы? 50 в простое в айде

Диод PCH обжигает, ноутбук тормозит
Ноутбук Dell Inspiron 3521. Начал греться диод PCH, даже в режиме простоя ноутбук теплый, диод...

HP Envy m6-1272er, греется диод PCH
здравствуйте. имеется данный ноутбук. почти сразу после покупки заметил, что греется корпус слева...

UPDATE SELECT, ERROR: null value in column violates not-null constraint
Здравствуйте. Две таблицы, из одной значением integer модифицируется int другой таблицы. В...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru