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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 54, средняя оценка - 4.70
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
#1

Strtok() и string - C++

16.07.2011, 19:54. Просмотров 7341. Ответов 25
Метки нет (Все метки)

По заданию нужно воспользоваться именно 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 то напишите их или если вы уверены что их точно нет то напишите об этом
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2011, 19:54
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Strtok() и string (C++):

strtok для string - C++
Существует ли strtok для string? Или его аналог

Strtok для string - C++
Есть ли какая-то функция, которая осуществляет strtok для string(из <string>) ?

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

Доступ к паре в map<string, vector<pair<string, string>>>Temp - C++
Подскажите пожалуйста как получить данные в векторе пар ? void showData(const map&lt;string, vector&lt;pair&lt;string, string&gt;&gt;&gt;Temp) { ...

strtok - C++
Привет! Решаю задачку на строки char. Возникла проблема вот код: //vuravnivanie slov po levomy i pravomy pol9m stranicu ...

strtok - C++
Скажите, если ли функция, аналог strtok, для типа string?

25
asics
Freelance
Эксперт С++
2847 / 1782 / 144
Регистрация: 09.09.2010
Сообщений: 3,841
16.07.2011, 19:56 #2
Gepar, Посмотри в документации, что возврощает strtok() и посмотри, кому ты это пытаешься присвоит.
2
Techno
Вирусоборец
317 / 119 / 2
Регистрация: 15.07.2011
Сообщений: 293
16.07.2011, 19:58 #3
Функция strtok

#include <string.h>
char *strtok(char *str1, const char *str2);
Функция strtok() возвращает указатель на следующую лексему в строке, адресуемой параметром str1.
А Вы ее в стринг, ай-яй-яй
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,274
Записей в блоге: 2
Завершенные тесты: 1
16.07.2011, 19:59 #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 память.
0
OstapBender
583 / 522 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
16.07.2011, 20:05 #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());
1
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
16.07.2011, 20:09  [ТС] #6
asics, тьфу, а я зациклился по поводу параметров, об этом я и не подумал, ну ка....

Добавлено через 2 минуты
Нет, всё равно не получается
C++
1
2
string str;
char *str2=strtok(str.c_str()," ");
0
nameless
Эксперт С++
334 / 298 / 14
Регистрация: 16.06.2009
Сообщений: 486
16.07.2011, 20:12 #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;
}
1
Jupiter
16.07.2011, 20:12
  #8

Не по теме:

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

0
nameless
16.07.2011, 20:16
  #9

Не по теме:

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

0
Jupiter
16.07.2011, 20:18
  #10

Не по теме:

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

Не по теме:


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

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

0
diagon
16.07.2011, 20:23
  #11

Не по теме:

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

0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
16.07.2011, 20:27  [ТС] #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 я точно это задание осилю
0
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
16.07.2011, 20:31 #13
Gepar, зачем вы заменяете знаки препинания на пробелы? Вместо этого добавьте их во второй параметр strtok.
0
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
16.07.2011, 20:32 #14
Цитата Сообщение от Gepar Посмотреть сообщение
Ну я же задачи делаю по задачнику, захотел автор strtok
ну так и делайте это задание с использованием Си строки, а робота с std::string и работа с указателями, это совсем разные уровни абстракции, хоть и результат их работы одинаков
0
Gepar
1177 / 533 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
16.07.2011, 20:36  [ТС] #15
Да ну нет же, автор написал сначала убрать с помощью функций string знаки препинания заменив их пробелами, а потом strtok() разбить строку на слова для вывода на экран ориентируясь на пробелы. Это же задача из задачника, а не реально имеющая смысл задача, нечему удивляться ) Лучше скажите что же сделал этот const_cast с моей const символьной строкой, не гуглится он что-то у меня.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.07.2011, 20:36
Привет! Вот еще темы с ответами:

strtok - C++
как с помощью функции strtok вывести последнее слово

strtok - C++
Почему так работает #include &lt;stdafx.h&gt; #include &lt;conio.h&gt; using namespace std; int main(){ char string = &quot;a string, of ,...

warning strtok - C++
Пишу в 10 студии: char* bla = strtok(&quot;bla bla bla&quot;, &quot; &quot;); Выдаёт варнинг: This function or variable may be unsafe. Consider using...

Не работает strtok() - C++
Здравствуйте, нужно посчитать количество слов в файле. Подскажите пожалуйста, что не так. Выводит только первую строку и все, количество...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
16.07.2011, 20:36
Ответ Создать тему
Опции темы

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