Форум программистов, компьютерный форум CyberForum.ru

Strtok() и string - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 54, средняя оценка - 4.70
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
16.07.2011, 19:54     Strtok() и string #1
По заданию нужно воспользоваться именно strtok чтобы разбить строку что есть на слова (ориентируясь на пробелы, все знаки препинания предварительно убираются).
Собственно
C++
1
2
3
4
string str;
...
string str2=strtok(str.c_str()," "); - материться
string str2=strtok(str.data()," "); - и так тоже матерится
Собственно ошибка связана с тем что strtok отказывается жевать const (вообще странно, она же не должна менять строку так не пофиг ли ей const или не const), есть вариант по поводу того как здесь быть? Хотя я и не исключаю варианта того что автор задания имел в виду создание строки в стиле си и последующую её инициализацию данными из моей строки, а потом уже использование с ней strtok, но всё же если у кого есть варианты как получить не const символьные данные из моей строки для strtok то напишите их или если вы уверены что их точно нет то напишите об этом
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2011, 19:54     Strtok() и string
Посмотрите здесь:

strtok C++
strtok C++
C++ функция strtok
C++ warning strtok
C++ strtok
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asics
Freelance
Эксперт C++
 Аватар для asics
2839 / 1776 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
16.07.2011, 19:56     Strtok() и string #2
Gepar, Посмотри в документации, что возврощает strtok() и посмотри, кому ты это пытаешься присвоит.
Techno
Вирусоборец
 Аватар для Techno
317 / 119 / 2
Регистрация: 15.07.2011
Сообщений: 293
16.07.2011, 19:58     Strtok() и string #3
Функция strtok

#include <string.h>
char *strtok(char *str1, const char *str2);
Функция strtok() возвращает указатель на следующую лексему в строке, адресуемой параметром str1.
А Вы ее в стринг, ай-яй-яй
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
16.07.2011, 19:59     Strtok() и string #4
Цитата Сообщение от Gepar Посмотреть сообщение
вообще странно, она же не должна менять строку так не пофиг ли ей const или не const
Она как раз меняет строку, разбивая ее. Хотя некоторые компиляторы (как-то в mingw (не помню какой версии) у меня получилось) могут работать константной строкой.

MSVS 2010
вот так:
C++
1
2
3
4
5
int main(){
    const char *ch="Hello world";
    char *ptr=strtok(ch," ");
    std::cout<<ptr;
}
некомпилирует, а так:
C++
1
2
3
4
5
int main(){
    const char *ch="Hello world";
    char *ptr=strtok((char*)ch," ");
    std::cout<<ptr;
}
ошибка времени выполнения, т.к. strtok() пытается изменит read only память.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
16.07.2011, 20:05     Strtok() и string #5
Цитата Сообщение от Gepar Посмотреть сообщение
Собственно ошибка связана с тем что strtok отказывается жевать const (вообще странно, она же не должна менять строку так не пофиг ли ей const или не const)
не в этом дело. strtok работает на этапе выполнения и возвращает указатель на участок выделенной памяти.
вы же пытаетесь пихнуть это дело в конструктор std::string. а он то выполняет проверки на этапе компиляции.

Добавлено через 2 минуты
юзай так:
C++
1
2
3
    std::string str="qwerty qwer123 123";
    char *c_st = new char[str.length()+1];
    strcpy(c_st,str.c_str());
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
16.07.2011, 20:09  [ТС]     Strtok() и string #6
asics, тьфу, а я зациклился по поводу параметров, об этом я и не подумал, ну ка....

Добавлено через 2 минуты
Нет, всё равно не получается
C++
1
2
string str;
char *str2=strtok(str.c_str()," ");
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
16.07.2011, 20:12     Strtok() и string #7
Gepar, попробуйте так, хоть и не очень хорошо так делать:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <string>
#include <cstring>
 
int main()
{
   std::string str = "test string";
   
   char* p = strtok(const_cast <char*> (str.c_str()), " ");
 
   std::cout << p << std::endl;
 
   return 0;
}
Jupiter
16.07.2011, 20:12
  #8

Не по теме:

либо автор темы либо автор задания, явно что-то курил

nameless
16.07.2011, 20:16
  #9

Не по теме:

Цитата Сообщение от Maxwe11 Посмотреть сообщение
Не по теме:
либо автор темы либо автор задания, явно что-то курил
Угу, куда разумней по строке тем же boost::split'ом пройтись..

Jupiter
16.07.2011, 20:18
  #10

Не по теме:

Цитата Сообщение от nameless Посмотреть сообщение

Не по теме:


Угу, куда разумней по строке тем же boost::split'ом пройтись..

или по старинке strtok-ом, НО!!! используя Cи строки

diagon
16.07.2011, 20:23
  #11

Не по теме:

Или с комфортом засунуть строку в stringstream...

Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
16.07.2011, 20:27  [ТС]     Strtok() и string #12
nameless, да, так помогло, у меня в итоге вот что получилось:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <iomanip>
#include <string>
#include <cstring>
using namespace std;
 
int main()
{
    string str;
    cout<<"Enter string: ";
    getline(cin,str);
    //пока в строке есть знаки пунктуации
    while(str.find_first_of(":,.;!?")!=-1)
     str.replace(str.find_first_of(":,.;!?"),1," "); //заменять их на пробелы
    //создать указатель на текущее слово
    char *str2=strtok(const_cast<char*>(str.c_str())," ");
    //если есть данные то вывести их
    if(str2)
     cout<<str2<<'\t';
    //пока есть слова выводить их на печать
    while(str2!=0)
     cout<<(str2=strtok(NULL," "))<<'\t';
}
Хотя я не знаю что такое const_cast, первый раз увидел такую конвертацию да и не понял что она делает. Ну str.c_str() вернула мне const указатель на мою строку в виде символьной строки в стиле си, а что сделал const_cast с ней ? Неужто как-то перевёл в обычную строку (не const) чего хотела от меня strtok()?

Добавлено через 1 минуту
Ну я же задачи делаю по задачнику, захотел автор strtok вот и делаю с strtok, тут идёт расчёт на то что если я извратом сделаю с strtok то уж с функциями для работы с string я точно это задание осилю
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
16.07.2011, 20:31     Strtok() и string #13
Gepar, зачем вы заменяете знаки препинания на пробелы? Вместо этого добавьте их во второй параметр strtok.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.07.2011, 20:32     Strtok() и string #14
Цитата Сообщение от Gepar Посмотреть сообщение
Ну я же задачи делаю по задачнику, захотел автор strtok
ну так и делайте это задание с использованием Си строки, а робота с std::string и работа с указателями, это совсем разные уровни абстракции, хоть и результат их работы одинаков
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
16.07.2011, 20:36  [ТС]     Strtok() и string #15
Да ну нет же, автор написал сначала убрать с помощью функций string знаки препинания заменив их пробелами, а потом strtok() разбить строку на слова для вывода на экран ориентируясь на пробелы. Это же задача из задачника, а не реально имеющая смысл задача, нечему удивляться ) Лучше скажите что же сделал этот const_cast с моей const символьной строкой, не гуглится он что-то у меня.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.07.2011, 20:42     Strtok() и string #16
http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx
Цитата Сообщение от Gepar Посмотреть сообщение
Да ну нет же, автор написал сначала убрать с помощью функций string знаки препинания заменив их пробелами, а потом strtok() разбить строку на слова для вывода на экран ориентируясь на пробелы.
создайте временный буфер(char*, char[]), скопируйте в него стринг, и делайте через strtok, а делать такие извраты со стрингом прямой способ "выстрелить себе в ногу"

Не по теме:

что за задачник, если не секрет?

Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
16.07.2011, 20:42     Strtok() и string #17
Цитата Сообщение от Gepar Посмотреть сообщение
Лучше скажите что же сделал этот const_cast с моей const символьной строкой, не гуглится он что-то у меня.
какие у нас гуглы разные)

Не по теме:

3-я ссылка - очень доходчиво объяснено.

nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
16.07.2011, 20:43     Strtok() и string #18
Gepar, Если, кратко,
C++
1
const_cast
- аннулирует действие модификаторов const и/или volatile..
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
16.07.2011, 20:59  [ТС]     Strtok() и string #19
Цитата Сообщение от Kastaneda Посмотреть сообщение
какие у нас гуглы разные)
Ну да, у меня же украинский, там такого нет

Цитата Сообщение от nameless Посмотреть сообщение
- аннулирует действие модификаторов const и/или volatile..
В этом посте я тоже нашёл незнакомое слово - volatile, хотя о нём я уже почитаю на cplusplus.com, там о нём написано.
Цитата Сообщение от Maxwe11 Посмотреть сообщение
что за задачник, если не секрет?
Книга Дейтела, в ней идут задания после каждого раздела, эти идут после класса string(он у него под конец книги уже), он доходчиво пишет потому и прохожу по нему. Всякие "выучить с++ за 21 день" вызывают отвращение так как не разжёвывают что и как работает, а в основном вскользь пишут чтобы побыстрее перейти к следующей теме.

Добавлено через 6 минут
С сайта мелкософта:
You cannot use the const_cast operator to directly override a constant variable's constant status.
Вот блин, а я то думал эта const_cast будет чудеса творить
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2011, 21:02     Strtok() и string
Еще ссылки по теме:

strtok C++
C++ strtok для string
Использование STRTOK Разбить строку на слова, из слов составить список C++ Функция strtok C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
16.07.2011, 21:02     Strtok() и string #20
Хм, не ожидал такого от Дейтелов... Может, они что-то перепутали, и это задание должно было быть в разделе по Си-строкам?.. Во всяком случае, не советую это упражнение выполнять таким образом, если сильно хочется - забудьте про std::string.
Yandex
Объявления
16.07.2011, 21:02     Strtok() и string
Ответ Создать тему
Опции темы

Текущее время: 16:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru