Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замена символа в строке, Поиск и замена символа с строке 
:(
    Опции темы
Fita
Дата 13.5.2006, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 12.5.2006
Где: Литва

Репутация: нет
Всего: нет



Может быть кто-нибудь сможет помочь: 

Есть определенный текст в файле, который считывается в text 
Код

bool text :: ReadText()
{
    fstream file(DMfile.c_str(), ios::in);
    if( ! file.is_open() ) return false;
    string tmp(""); 
    while( !file.eof() )
    {
      if( file.bad() || file.fail() ) return false;
      tmp += file.get();
    }
    file.close();
    tekstas = tmp;
    return true;
}
 

Задача: 
Каждое новое предложение в тексте начинается со строчной буквы. Необходимо эти строчные буквы заменить на заглавные. 
Найти длину максимального пробела между словами. 

Идея решения задачи у меня следующая. 
size_t i = strlen(tekstas); // находим длину строки 
Перебирая строку до конца, ищем символ ". ! ?" От них вперед отсчитываем пробелы и возвращаем индекс первой буквы i. Менем первую букву tekstas[i] = toupper(tekstas[i]); 
Тоже самое с пробелами: ищем индекс первого пробела, и проверяем, есть ли за ним еще пробелы. Сравниваем длину придыдущего пробела с длиной следующего. 

ЧТо-то компелятору не понравилось: size_t i = strlen(tekstas); 
Пишет: strlen' : cannot convert parameter 1 from 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' to 'const char *' 

Может быть есть более оптимальные решения данной задачи? 
PM MAIL   Вверх
DeadSoul
Дата 13.5.2006, 00:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



use strlen( tekstas.c_str() (
не путай std::string и Си-строки! 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
Fita
Дата 13.5.2006, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 12.5.2006
Где: Литва

Репутация: нет
Всего: нет



А как в данному случае вообще необходимо работать с строкой tekstas?

Код

    int max1=0, promezutok;
 for (int i=0; i<=strlen(tekstas.c_str()); i++); 
 { 
    
    if (tekstas[i]==" ") 
    { 
        max1=max1+1;
    } 
    if (max1=>promezutok) promezutok=max1; 
    max1=0;
 }
 

Выдает ошибку: 
'==' : no conversion from 'char *' to 'int' 
PM MAIL   Вверх
dips
Дата 13.5.2006, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 12.5.2006

Репутация: нет
Всего: нет



Код

String tekstas = "SomeText";
for(int i = 1;i < strlen(tekstas.c_str())+1;i++ )
    {
         if (tekstas[i] == 'e')
         {
                ShowMessage("Find");
         }
    }

вот так вот и работать8) 
PM MAIL   Вверх
Mayk
Дата 13.5.2006, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Зачем использовать strlen, если у textas есть Length(кажется так он обзывается в AnsiStringах)?
Если AnsiString'и существенно не деградировали, то Length() будет выполнятся быстрее связки c_str + strlen. Потому что strlen выполняется за линейное время.


Цитата(Fita @  13.5.2006,  04:29 Найти цитируемый пост)
Может быть есть более оптимальные решения данной задачи?  

Можно активно использовать std::string. 
На входе в tmp у нас исходная строка, то требумые преобразования можно делать используя find_first_of и isalpha/toupper
Что-то вроде того:
Код

#include <string>
#include <iostream>

using namespace std;

int main()
{
    string tmp = "hello world. how a u? i'm fine, t10x. bye! bye..";
    char* end=".?!";
    int i=0;
    cout << tmp << endl;
    for(;;){
        i = tmp.find_first_of(end, i);
        if(i < 0){ //nothing to do
            break;
        }
        while(i<tmp.length()){ 
            if(!isalpha(tmp[i])){
                ++i;
            } else {
                tmp[i] = toupper(tmp[i]);
                break;
            }
        }
        ++i;
    }
    cout << tmp << endl;    
}

 


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
MAKCim
Дата 13.5.2006, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Mayk
первую букву не учел 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
MAKCim
Дата 13.5.2006, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Код

unsigned int convert(string& str)
{
    string::iterator i=str.begin(), j;
    const char* let_space_c="\t ", *let_devider_c="?.!";
    unsigned int max=0;
    while (i!=str.end())
    {
        j=iter_if(i,str.end(),functor(let_space_c));
        if (j!=str.end())
        {
            max=j-i>max ? j-i: max;
            (*j)-=32;
        }
        i=find_if(j,str.end(),functor(let_devider_c));
    }
    return max;
}
 
iter_if -  возвращает первый элемент не удовлетворяющий предикату functor()
find_if - возвращает первый элемент удовлетворяющий предикату functor() 

Это сообщение отредактировал(а) MAKCim - 13.5.2006, 15:46


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Fita
Дата 14.5.2006, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 12.5.2006
Где: Литва

Репутация: нет
Всего: нет



Спасибо всем откликнувшимся за помощь. Она действительно пригодилась. 

И еще вопрос: почему строки нельзя сравнивать, как переменные (==)(!=)? И как в таком случае сравнивать строки?  

Это сообщение отредактировал(а) Fita - 14.5.2006, 13:12
PM MAIL   Вверх
Fazil6
Дата 14.5.2006, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

И еще вопрос: почему строки нельзя сравнивать, как переменные (==)(!=)? И как в таком случае сравнивать строки?

если  речь о std::string, то можно так сравнивать, если речь о char*, то есть функция strcmp 
PM MAIL   Вверх
DeadSoul
Дата 14.5.2006, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1217
Регистрация: 25.9.2005
Где: Москва

Репутация: 2
Всего: 11



Цитата(Fazil6 @  14.5.2006,  13:42 Найти цитируемый пост)
Цитата
И еще вопрос: почему строки нельзя сравнивать, как переменные (==)(!=)? И как в таком случае сравнивать строки?
если  речь о std::string, то можно так сравнивать, если речь о char*, то есть функция strcmp  

у std::string есть переопределенные операторы == и !=, но между std::string и С-строками есть важное отличие - std::string может содержать нулевые и т.п. символы
 


--------------------
 Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". 

Бьем спамеров их же оружием. Пусть весь спам сыпется им
[email protected] 
PM   Вверх
bsa
Дата 14.5.2006, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Fita
Если ты определил переменную str, как std::string, то запись str[i] (где i - целое) имеет тип char, а не char*. Соответственно, ты можешь str[i] сравнивать только с числами и символами, поэтому компилятор и ругнулся:
Код
if (str[i] == '.' ) ...   //правильно
if (str[i] == "." ) .... // неправильно
if (str == "some text" ) ... //правильно
if (str == 10 ) ... //неправильно
if (str == std::string("some text") ) ... //правильно
 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1297 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.