Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Замена символа в строке


Автор: Fita 13.5.2006, 00:29
Может быть кто-нибудь сможет помочь: 

Есть определенный текст в файле, который считывается в 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 *' 

Может быть есть более оптимальные решения данной задачи? 

Автор: DeadSoul 13.5.2006, 00:52
use strlen( tekstas.c_str() (
не путай std::string и Си-строки! 

Автор: Fita 13.5.2006, 01:13
А как в данному случае вообще необходимо работать с строкой 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' 

Автор: dips 13.5.2006, 08:37
Код

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

вот так вот и работать8) 

Автор: Mayk 13.5.2006, 13:52
Зачем использовать 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;    
}

 

Автор: MAKCim 13.5.2006, 15:26
Mayk
первую букву не учел 

Автор: MAKCim 13.5.2006, 15:46
Код

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() 

Автор: Fita 14.5.2006, 13:11
Спасибо всем откликнувшимся за помощь. Она действительно пригодилась. 

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

Автор: Fazil6 14.5.2006, 13:42
Цитата

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

если  речь о std::string, то можно так сравнивать, если речь о char*, то есть функция strcmp 

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

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

Автор: bsa 14.5.2006, 20:54
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") ) ... //правильно
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)