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

использование класса string.объясните плз - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.86
limelight
7 / 7 / 0
Регистрация: 17.04.2010
Сообщений: 112
09.05.2010, 20:06     использование класса string.объясните плз #1
Есть вот такой код:

C++
1
2
3
4
5
6
7
int x = s1.find ( ' ' );   // ищем пробелы
 
  while ( x < s1.size ( ) )        // цикл по всем пробелам
  {
    s1.replace(x, x+1, 1, '/');      // заменяем пробел на '/'
    x = s1.find ( ' ' );           // ищем следующий пробел
  }
который заменяет все пробелы в строке s1 на определенный нами символ.
В описании класс string имеется множество перегруженных функций с одним названием replace.
Под нужды этого куска кода подходят всего два описания:
1)
C++
1
2
3
4
5
6
basic_string& replace(
   size_type _Pos1, 
   size_type _Num1,
   size_type _Count, 
   value_type _Ch
);
2)
C++
1
2
3
4
5
6
basic_string& replace(
   iterator _First0, 
   iterator _Last0,
   size_type _Num2, 
   value_type _Ch
);
В моем куске как я понял был использован второй вариант, т.е. в качестве параметров я передал
диапазон символов, ограниченный _First0 и _Last0 , _Num2 копиями символа _Ch.
А если бы я захотел использовать первое определение как мне надо было бы делать?
(т.е. если я напишу такую строку
C++
1
s1.replace(x, 1, 1, '/');
сработает все равно второй вариант определения?

Позвольте, чтобы не плодить темы, попутно задать второй вопрос...
почему при x = s1.find ( ' ' ); у нас увеличивается x ? т.е. поиск не с начала строки начинается а продолжается с места на котором остановились?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
FireNovel
 Аватар для FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
09.05.2010, 20:29     использование класса string.объясните плз #2
В моем куске как я понял был использован второй вариант, т.е. в качестве параметров я передал
диапазон символов, ограниченный _First0 и _Last0 , _Num2 копиями символа _Ch.
Как раз наоборот первый вариант т.к. x и x+1 - выражения целочисленного типа, а не итераторы

Позвольте, чтобы не плодить темы, попутно задать второй вопрос...
почему при x = s1.find ( ' ' ); у нас увеличивается x ? т.е. поиск не с начала строки начинается а продолжается с места на котором остановились?
Разберись с тем, что возвращают функции члены класса string
find() - возвращает позицию первого вхождения искомого символа
limelight
7 / 7 / 0
Регистрация: 17.04.2010
Сообщений: 112
10.05.2010, 17:58  [ТС]     использование класса string.объясните плз #3
Как то не очень дружелюбно. И, по моему, неправльно вы подсказали, возможно я ошибаюсь.

В моем куске как я понял был использован второй вариант, т.е. в качестве параметров я передал
диапазон символов, ограниченный _First0 и _Last0 , _Num2 копиями символа _Ch.
Как раз наоборот первый вариант т.к. x и x+1 - выражения целочисленного типа, а не итераторы
если бы был первый вариант то с позиции х заменялось бы х+1 символ, т.е. если позиция х равна10, то следующий параметр Num1 был бы равен 11 что означало бы " с 10 позиции заменить 11 символов на".
а по факту, в программе получается " с 10 позиции по 11 позицию заменять на". это раз

а во вторых,
Разберись с тем, что возвращают функции члены класса string
find() - возвращает позицию первого вхождения искомого символа
я уже разобрался, но и здесь ответ не корректен...( я в курсе что у нас возвращает эта функция.
но поиск производится с места "где мы остановились" потому что предыдущие пробелы были заменены на символ'\' вот и все! и поэтому следующий пробел в строке и будет первым, так как предыдущий уже не пробел...мда.
так что же с первым вопросом? кто может нормально объяснить в чем дело ? что такое итераторы?
FireNovel
 Аватар для FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
10.05.2010, 22:06     использование класса string.объясните плз #4
Как то не очень дружелюбно.
Ну,что ж приношу свои извинения сударь, если я потеребил Вашу детскую психику
Впредь буду более толерантен, и обходителен

В моем куске как я понял был использован второй вариант, т.е. в качестве параметров я передал
диапазон символов, ограниченный _First0 и _Last0 , _Num2 копиями символа _Ch.
Как раз наоборот первый вариант т.к. x и x+1 - выражения целочисленного типа, а не итераторы
Давайте будем разбираться вместе:
Есть функция член шаблонного класса basic_string
C++
1
2
3
4
5
6
basic_string& replace(
   size_type _Pos1, 
   size_type _Num1,
   size_type _Count, 
   value_type _Ch
);
Эта фукнкция, заменяет до _Num1 символов вызывающей строки начиная с позиции _Pos1, _Сount копиями символа _Ch.
Три первых аргумента её имеют тип size_type, который является разновидностью целочисленого типа size_t

Так как, при вызове replace() Вы в качестве, как минимум 2х первых, аргументов передавали результат выполнения функции Find(),которая, в свою очедедь, возвращает именно size_type, из этого и можно зделать вывод, что был использован первый из двух, приведенных Вами вариантов метода replace().

По поводу второй перегрузки
C++
1
2
3
4
5
6
basic_string& replace(
   iterator _First0, 
   iterator _Last0,
   size_type _Num2, 
   value_type _Ch
);
Эта функция заменяет диапазон символов, ограниченный итераторами _First0 и _Last0, _Num2 копиями символа _Ch.
Итераторы (iterators) — это объекты, которые по отношению к контейнерам
играют роль указателей. Они позволяют получать доступ к содержимому контейнера примерно так же, как указатели используются для доступа к элементам массива.
В Вашей проге итераторы, насколько я понял, не использовались.

Ну, вобщем ход своих мыслей, надеюсь, я Вам объяснил
limelight
7 / 7 / 0
Регистрация: 17.04.2010
Сообщений: 112
13.05.2010, 18:15  [ТС]     использование класса string.объясните плз #5
Ну,что ж приношу свои извинения сударь, если я потеребил Вашу детскую психику
Впредь буду более толерантен, и обходителен
Уважаемый, что ж вы так агрессивны? Я на вас даже и не дунул а вы уже защищаетесь) не уж то вас кто то в детстве так сильно обидел что осталась глубокая травма?))

Ну, вобщем ход своих мыслей, надеюсь, я Вам объяснил
FireNovel, ваши мысли более чем логичны, спасибо!

Я открыл MSDN, более внимательно все перевел, посмотрел программу под отладчиком и все понял, видимо раньше что то незаметил. Еще раз спасибо!)
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
21.06.2010, 22:45     использование класса string.объясните плз #6
а как прочитать один символ из файла для его последующей проверки со строкой?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
21.06.2010, 23:11     использование класса string.объясните плз #7
limelight, сам цикл не правильно организован. К тому же проще использовать тот вариант string::replace(), который в качестве замещающего параметра строку принимает...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
 
int main(){
    std::string buf;
    
    std::cout << "String: ";
    std::getline(std::cin, buf);
    size_t pos;
    while ( ( pos = buf.find(' ') ) != std::string::npos )
        buf.replace(pos, 1, "/");
    std::cout << "Result: " << buf << std::endl;
    
    return 0;
}
Если один символ на другой заменяется, по-моему лучше вот так сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
 
int main(){
    std::string buf;
    
    std::cout << "String: ";
    std::getline(std::cin, buf);
    for ( std::string::iterator i = buf.begin(); i != buf.end(); ++i )
        if ( *i == ' ' )
            *i = '/';
    std::cout << "Result: " << buf << std::endl;
    
    return 0;
}
FireNovel
 Аватар для FireNovel
150 / 73 / 8
Регистрация: 09.04.2010
Сообщений: 297
22.06.2010, 13:02     использование класса string.объясните плз #8
Цитата Сообщение от Egeni Посмотреть сообщение
а как прочитать один символ из файла для его последующей проверки со строкой?
Может как-то так:
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
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int main()
{
    ifstream fin( "Test.txt" );  // содержимое файла /*c*/
    if ( !fin )
        exit(-1);
    
    char c1 = fin.get();
 
    string s = "abcd";
 
    if( s.find( c1 ) != string::npos )
        printf ( " v stroke \"s\" simvol  \'%c\' iz faila\n   prisutstvuet!\n", c1 );
 
    fin.close();
 
    system("PAUSE");
    exit(1);
}
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 1
22.06.2010, 13:14     использование класса string.объясните плз #9
Цитата Сообщение от easybudda Посмотреть сообщение
Если один символ на другой заменяется, по-моему лучше вот так сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
 
int main(){
    std::string buf;
    
    std::cout << "String: ";
    std::getline(std::cin, buf);
    for ( std::string::iterator i = buf.begin(); i != buf.end(); ++i )
        if ( *i == ' ' )
            *i = '/';
    std::cout << "Result: " << buf << std::endl;
    
    return 0;
}
Хм...мне так больше нравится..
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <algorithm>
#include <iostream>
#include <string>
 
int main()
{
    std::string buff = "String String S S";
 
    std::replace(buff.begin(), buff.end(), ' ', '/');
 
    std::cout << buff << std::endl;
 
    return 0;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
22.06.2010, 15:18     использование класса string.объясните плз #10
Цитата Сообщение от ISergey Посмотреть сообщение
Хм...мне так больше нравится..
Да, так лучше
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2010, 16:35     использование класса string.объясните плз
Еще ссылки по теме:

C++ Объясните пожалуйста как тут работает сортировка и что такое ostream_iterator<string>
Использование объекта одного класса при создании нового класса C++
Объясните семантику операций класса C++

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

Или воспользуйтесь поиском по форуму:
Egeni
10 / 10 / 1
Регистрация: 17.06.2010
Сообщений: 107
Записей в блоге: 1
31.07.2010, 16:35     использование класса string.объясните плз #11
считываю файл файл в строку
вот фрагмент
char* FileToStr= new char [Razmer_Faila+ 1];

//И собсно запись файла в эту строку
if (fread (FileToStr, 1, Razmer_Faila, f)<Razmer_Faila) {
printf ("ne udalos shitat fail v stroku\n");
system ("pause");
return 0;
}

пытался использовать find невыходит...
81 E:\ABC\FtoSTR\MYDW.cpp `find' has not been declared
как find использовать?
Yandex
Объявления
31.07.2010, 16:35     использование класса string.объясните плз
Ответ Создать тему
Опции темы

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