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

Использование string - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
Lennadij
3 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 45
17.10.2011, 23:41     Использование string #1
Даны текстовая строка и слово (например, ba). Напечатать все слова, входящие в эту текстовую строку, начинающиеся с букв заданного слова (например, bak, barber, baab, baalam), используя string. Подскажите пожалуйста, а то ни как не могу разобраться с эти string.
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Revol'veR
 Аватар для Revol'veR
23 / 23 / 2
Регистрация: 05.11.2010
Сообщений: 134
18.10.2011, 00:14     Использование string #2
Могу чуть путаться в синтаксисе. Если что не так, пусть меня поправят.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <conio.h>
#include <string.h>
 
int main()
{
   char str[] = "Come  back to me baby";
   char key[] = "ba";
char * pch;
 
pch = strtok(str," ");
while(pch != NULL){
        if(strncmp(pch,key,2) == 0)
printf("\n%s",pch);
pch = strtok(NULL," ");
}
 
   _getch();
}
gooseim
Эксперт C++
500 / 404 / 35
Регистрация: 23.09.2010
Сообщений: 1,139
18.10.2011, 00:21     Использование string #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <string>
#include <iterator>
#include <algorithm>
#include <iostream>
#include <sstream>
 
void printif(const std::string& sent, const std::string& word, std::ostream &ostream)
{
   using namespace std;
   istringstream stream(sent);
   istream_iterator<string> begin(stream), end;
   for(;begin!=end;++begin)
   {
      if(begin->substr(0, word.length())==word)
         ostream<< *begin<<" ";
   }
}
 
int main()
{
   printif("akbar autum bak barber baab baalam cabba calc", "ba", std::cout);
}
KeyGen
 Аватар для KeyGen
333 / 289 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
18.10.2011, 01:18     Использование string #4
Может тебе и не пригодиться, но можно сделать и так:
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
#include <iostream>
 
using std::cout;
using std::cin;
using std::endl;
    
int main()
{
    setlocale(LC_ALL, "rus");
    
    char *p[6] = {"bra","bak", "barber", "baab", "baalam","cool"}; // массив указателей
    
    
    int schet=0;
    
    for (int i=0; i<6; i++){
        for (int j=0; j<10; j++){
        if(*p[i]=='b'){ 
        schet++;          
        (p[i])++; 
        if(*p[i]=='a'){
        schet++;
        break;}
        else
        (p[i])--;
        }
        (p[i])++;
        }
        if(schet==2){
        p[i]--;
        cout << p[i] << endl;
        schet=0;
        }
        schet=0;
        }
    
    cout << "\n\n\n";
    system("PAUSE");
    return 0;
}
Миниатюры
Использование string  
Lennadij
3 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 45
18.10.2011, 21:14  [ТС]     Использование string #5
а если мы будем использовать класс string то аналогично пишется прога?
KeyGen
 Аватар для KeyGen
333 / 289 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
18.10.2011, 23:53     Использование string #6
Цитата Сообщение от Lennadij Посмотреть сообщение
а если мы будем использовать класс string то аналогично пишется прога?
Если ты о моей. То нет. Со string так не получиться. Если еще актуально напишу... В первый раз задание не дочитал
KeyGen
 Аватар для KeyGen
333 / 289 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
19.10.2011, 00:09     Использование string #7
Во общем вот так:
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
#include <iostream>
 
using std::cout;
using std::string;
using std::endl;
    
int main()
{
    setlocale(LC_ALL, "rus");
    
    string str[10]={"bra","bak", "Barber", "baab", "baalam","cool"};
    
    int schet =0;
    
    for (int i=0; i<6; i++){
        for (int j=0; j<1; j++){
            if(str[i][j]=='b'||str[i][j]=='B')
            schet++;
            if(str[i][j+1]=='a'||str[i][j+1]=='A')
            schet++;
            }
            if(schet==2)
            cout << str[i] << endl;
            schet=0;
            }
    
    cout << "\n\n\n";
    system("PAUSE");
    return 0;
}
Миниатюры
Использование string  
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
19.10.2011, 00:15     Использование string #8
Никто не знает, есть ли аналог функции strtok для типа std::string?
Mr.X
Эксперт С++
 Аватар для Mr.X
2801 / 1577 / 247
Регистрация: 03.05.2010
Сообщений: 3,663
19.10.2011, 11:29     Использование string #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Chelioss Посмотреть сообщение
Никто не знает, есть ли аналог функции strtok для типа std::string?
Нет, но ее легко написать:
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
/////////////////////////////////////////////////////////////////////////////////////////
//Аналог функции strtok для типа std::string.
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string         T_str;
typedef std::vector<T_str>  T_strings;
/////////////////////////////////////////////////////////////////////////////////////////
void  stringtok
    (
        T_str         s,
        const T_str&  delimset,
        T_strings&    tokens
    )
{    
    T_str::size_type  start_pos = 0;
    T_str::size_type  delim_pos = 0;
    while( 
            ( 
                delim_pos = s.find_first_of(delimset, start_pos) 
            ) 
            != T_str::npos 
         )
    {
        s.replace(delim_pos, 1, " ");
        start_pos = delim_pos + 1;
    }
    std::istringstream  ssin(s);
    std::copy
        (
            std::istream_iterator<T_str>    (ssin),
            std::istream_iterator<T_str>    (),
            std::back_inserter              (tokens)
        );
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{
    T_strings  tokens;    
    T_str      s = "a bb\tccc                       dddd12eeeee123ffffff";    
    stringtok(s, "123 \t", tokens);
 
    std::copy
        (
            tokens.begin(),
            tokens.end(),
            std::ostream_iterator<T_str>(std::cout, "\n")
        );
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2011, 19:57     Использование string
Еще ссылки по теме:

C++ Использование string в многофайловом приложении. Необходимость подключения библиотек и пространства имён
Использование кириллицы с типом string C++
Использование переменной под string в функциях C++

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

Или воспользуйтесь поиском по форуму:
Lennadij
3 / 3 / 0
Регистрация: 08.10.2011
Сообщений: 45
20.10.2011, 19:57  [ТС]     Использование string #10
KeyGen, спасибо большое за программу. но преподаватель сказал, что нужно сделать чтобы строка вводилась, а не была уже задана (потом работать с ней с помощью разделителей), и заданное слово тоже вводилось. Попробовала сделать так, но не могу найти в чем ошибка. Может посмотришь ее?

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
// 2.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
 
void main ()
{   string s,s1,*s2;//Cоздали два объекта класса 
                    //string и указатель на объект классса string
    int k=0;
    char *p;
    string razd=" ,.:"; /*Создали объект класса string, с помощью конструктора копирования для хранения разделителей между словами */
    string word; /*Создали объект класса string
    cout<<"Enter string:  ";
    getline(cin,s);//Считали строку из потока cin
    s2=new string [s.length()/2];//Выделили память под 
                            //массив строк
    s1=s;/* Скопировали строку s в строку s1 с помощью переопредленной операции = */
    cout<<"syllable type: ";
    cin>>word;
    int n= s1.find_first_of(razd);/*Нашли позицию первого разделителя в строке s1*/
    while (n!=NPOS)
    {
        if (n)
        {
            s2[k]=s1.substr(0,n); /*Сохранили подстроку до разделителя как очередной элемент массива */
            if (word.find(s2[k][0])!=NPOS)cout<<"\n"<<s2[k];
            k++;
        }
        s1=s1.substr(n+1); /*Далее рассматриваем только оставшуюся часть строки*/
        n=s1.find_first_of(razd);//Нашли позицию очередного разделителя
    }
    s2[k]=s1; //Обработка последнего слова
    if (word.find(s2[k][0])!=NPOS)cout<<"\n"<<s2[k];
}
Добавлено через 24 минуты
Тема закрыта) я поняла где была ошибка)ура!!!!!!! Для интереса вот переписанная часть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string::size_type npos;
    npos=s1.find_first_of(razd);/*Нашли позицию первого разделителя в строке s1*/
    while (npos!=string::npos)
    {
        if (npos)
        {
            s2[k]=s1.substr(0,npos); /*Сохранили подстроку до разделителя как очередной элемент массива */
            if (word.find(s2[k][0])!=string::npos)cout<<"\n"<<s2[k];
            k++;
        }
        s1=s1.substr(npos+1); /*Далее рассматриваем только оставшуюся часть строки*/
        npos=s1.find_first_of(razd);//Нашли позицию очередного разделителя
    }
    s2[k]=s1; //Обработка последнего слова
    if (word.find(s2[k][0])!=string::npos)cout<<"\n"<<s2[k];
system("PAUSE");
И вуаля все работает

 Комментарий модератора 
Используйте теги форматирования кода!
Yandex
Объявления
20.10.2011, 19:57     Использование string
Ответ Создать тему
Опции темы

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