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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замена пробелов String.h 
V
    Опции темы
Anikmar
Дата 17.3.2009, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Winterlord @  17.3.2009,  00:47 Найти цитируемый пост)
А ваш алгоритм игнорирует пробелы перед текстом и после?

Мой алгоритм делает из нескольких пробелов подряд один. А нужно было игнорировать? Тогда дополнительный флаг появится - признак начала строки. И дополнительная переменная - счетчик пропущенных пробелов.

PM MAIL ICQ   Вверх
Winterlord
Дата 17.3.2009, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Anikmar @  17.3.2009,  00:53 Найти цитируемый пост)
А нужно было игнорировать?


Я ж тут писал:
Цитата(Winterlord @  16.3.2009,  23:04 Найти цитируемый пост)
Немного поясню задание: 

На входе: "      The    project     of     the         International     Phonematic      Alphabet         "

На выходе: "      The project of the International Phonematic Alphabet         "
тоесть должны заменяться  только внутренние пробелы на один, а те пробелы, которые находятся перед текстом и за текстом, должны оставаться неизменными. И всё это должно быть реализовано с использованием функций из библиотеки string.h. Обращаться к элементам массива можно только через указатели. Вот и не знаю как сделать=\ 

Предполагаю, что нужно завести дополнительный массив, искать в  первом массиве первый пробел (кроме тех, что перед текстом <-- тоже не совсем понятно как пропустить), далее копировать с исправлениями кусок во второй массив и так далее. В итоге во втором массиве образуется исправленный текст. 

Совсем запутался)

PM MAIL ICQ   Вверх
Dmi3ev
Дата 17.3.2009, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



вот накидал... указаетелей - туча...
Код

#include "stdafx.h"
#include <iostream>
#include <fstream>

using namespace std;

int _tmain()
{
    char buf[256];
    
    ofstream fo("D:\\1.txt");
    ifstream fi("D:\\2.txt");

    while (!fi.eof())
    {
        fi.getline(buf,256);
        char *p;
        char *d=" ";
        char *bt=buf;
        
        while (*bt==' ')
            fo<<*(bt++);
        char *et=buf;
        
        et+=strlen(buf)-1;
        
        while (*et==' ' && et!=bt)
            et--;
        p=strtok(buf, d);
        while (p=strtok(NULL, d))
                fo<<p<<" ";
        while (*et==' ')
            fo<<*(et--);
        fo<<endl;
    }
    fo.close();
    fi.close();
    return 0;
}

есть две недоработки:
1) не рассматривал случай, если одни пробелы в строке.
2) в строке с комментарием всегда прибавляется пробел к слову, но при добавлении последнего куска текста этого делать не надо,
это остается тебе для размышления, а так вроде нормуль... хотя хз, я не тестил)))

Добавлено @ 01:25
Цитата

2) в строке с комментарием всегда прибавляется пробел к слову, но при добавлении последнего куска текста этого делать не надо,

те к тексту прибавляется один лишний пробел, думаю сможешь поправить, мне лень...

Это сообщение отредактировал(а) Dmi3ev - 17.3.2009, 01:25


--------------------

PM MAIL   Вверх
Winterlord
Дата 17.3.2009, 01:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Dmi3ev @  17.3.2009,  01:23 Найти цитируемый пост)
#include "stdafx.h"

Спасибо
а что вот это такое?


Это сообщение отредактировал(а) Winterlord - 17.3.2009, 01:28
PM MAIL ICQ   Вверх
Dmi3ev
Дата 17.3.2009, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

а что вот это такое?

не важно, просто я компилил в MS VS, тебе надо это убрать и переименовать _tmain() в main

Добавлено через 2 минуты
вместо 
Код

#include "stdafx.h"
#include <iostream>
#include <fstream>
using namespace std;
int _tmain()
{
//...
}

тебе надо
Код

#include <iostream.h>
#include <fstream.h>
#include <string.h>
int main()
{
//...
}


Добавлено через 3 минуты и 11 секунд
Цитата

те к тексту прибавляется один лишний пробел, думаю сможешь поправить, мне лень...

а можешь и не править, потому как сзади незаметно))) впереди бы было заметно, а сзади +1 пробел, ничего страшного)))


--------------------

PM MAIL   Вверх
Winterlord
Дата 17.3.2009, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Dmi3ev, Большое спасибо, уж завтра попробую, отпишусь;)
PM MAIL ICQ   Вверх
Anikmar
Дата 17.3.2009, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Гы. И мой вариант.
Вроде работает.
Варианты - когда конец файла вместо конца строки и одни пробелы в строке вроде как отрабатывает.
Недостаток:Если конец файла в строке вместо конца строки - то в результирующем файле добавится конец строки перед концом файла
Код

void DeleteSpaces(void)
{
    const int SizeOfBuff = 255;
    string str_in, str_out,str_temp;
    FILE *InputFile, *OutputFile;
    char Symbol;
    int Ret;
    bool FlagSpace = false;
    bool FlagStartLine;
    char Buff[SizeOfBuff+1] = {0};
    int Count;

    InputFile = fopen("input2.txt","r");
    OutputFile = fopen("output2.txt","w+");

    while(!feof(InputFile))
    {
        fgets(Buff,SizeOfBuff,InputFile);
        str_in = Buff;
        str_out.clear();
        FlagStartLine = true;
        Count = 0;
        for(unsigned int j=0;j<str_in.length();j++)
        {
            Symbol = (char)str_in[j];
            if (Symbol == ' ')
            {
                Count++;
                if ((FlagSpace)&&(!FlagStartLine)) continue;
                else FlagSpace = true;
            }
            else
            {
                if (Symbol == '\n') continue;
                Count = 0;
                FlagSpace = false;
                FlagStartLine = false;
            }
            str_out.push_back(Symbol);
        }
        if ((Count > 1)&&(!FlagStartLine)) str_out.append(Count-1,' ');
        str_out.push_back('\n');
        fputs(str_out.c_str(),OutputFile);
    }

    fclose(InputFile);
    fclose(OutputFile);
}

PM MAIL ICQ   Вверх
Dmi3ev
Дата 17.3.2009, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата

Dmi3ev, Большое спасибо, уж завтра попробую, отпишусь;) 

вот тебе:
Код

#include <iostream.h>
#include <fstream.h>
#include <string.h>

int main()
{
    char buf[256];
    
    ofstream fo("D:\\1.txt");
    ifstream fi("D:\\2.txt");

    while (!fi.eof())
    {
        fi.getline(buf,256);
        char s[256];
        int i=0;
        char *p;
        char *d=" ";
        char *bt=buf;
        
        while (*bt==' ')
            s[i++]=*(bt++);
        char *et=buf;
        
        et+=strlen(buf)-1;
        
        while (*et==' ' && et!=bt)
            et--;
        p=strtok(buf, d);
        while (p=strtok(NULL, d))
        {
            while (*p)
                s[i++]=*(p++);
            s[i++]=' ';
        }
        if (i>0)
            i--;
        while ((*et==' ') && (et!=bt))
            s[i++]=*(et--);
        s[i]='\0';
        fo<<s;
        cout<<s<<endl;
        fo<<endl;
    }
    fo.close();
    fi.close();
    system("pause");
    return 0;
}

дурацкие действия не предусмотрены, но если все будет нормально, то это прога работает...


--------------------

PM MAIL   Вверх
mes
Дата 17.3.2009, 03:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



не смотря на обилие кода в этой теме, вношу свою лепту:
Код

void fn(char* s)
{
    for (;*s && *s==' '; ++s);           // пропускаем начальные пробелы

    for (char *p=s; *p;)
    {
        for(;*p && *p!=' ';++p) *s++=*p; // копируем не_пробелы

        char *p1=p;                      // запоминаем позицию
        for(;*p && *p==' ';++p);         // пропускаем все пробелы

        if (*p) *s++=' ';                // если не дошли до конца_строки то ставим только один пробел
        else for (;p1<p;++p1) *s++=' ';  // иначе ставим все
    }
    *s='\0';  //ставим новый конец строки.
}


Код


int main ()
{
  char s[] = "      The    project     of     the         International     Phonematic      Alphabet         ";

  std::cout<<"-"<<s<<"-"<<std::endl;

  fn(s);
  std::cout<<"-"<<s<<"-"<<std::endl;

  system("pause");
  return(0);
}


Это сообщение отредактировал(а) mes - 17.3.2009, 03:23


--------------------
PM MAIL WWW   Вверх
mes
Дата 17.3.2009, 03:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



вот еще подправил
Код

void fn(char* s)
{
    for (;*s && *s==' '; ++s);               // оставляем начальные пробелы

    char *last =s;

    for (char *p=s; *p; ++p) if (*p!=' ') last=p; // ищем последний не_пробел.

    for (char *p=s; p<=last;)
    {
        for(;p<=last && *p!=' ';++p) *s++=*p; // копируем слово (пока не_пробел)

        if (p<last)                   // если еще не дошли до последнего_символа,
        {
           *s++=' ';                  // то ставим один пробел
           for(; *p==' ';++p);        // и игнорируем остальные
        }
    }

    for (++last; *last; ++last) *s++=*last;    // переносим финальные пробелы

    *s='\0';  //ставим новый конец строки.
}



теперь логика обработки как  начальных так  и конечных пробелов отделена от центральных. smile

Это сообщение отредактировал(а) mes - 17.3.2009, 10:06


--------------------
PM MAIL WWW   Вверх
Anikmar
Дата 17.3.2009, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну, препода просто завалить можно вариантами  smile 
PM MAIL ICQ   Вверх
mes
Дата 17.3.2009, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Anikmar @  17.3.2009,  11:09 Найти цитируемый пост)
Ну, препода просто завалить можно вариантами  smile  

 smile 
теперь главное, чтоб тс сам не "завалился" в этом изобилии  smile 


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


Шустрый
*


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

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



Цитата(Dmi3ev @  17.3.2009,  01:53 Найти цитируемый пост)
вот тебе:


Dmi3ev,  Ваша программа работает, но съедает любое первое слово. Например на входе "       The project     of     the         International     Phonematic      Alphabet    ", а на выходе: "       project of the International Phonematic Alphabet"
И что то это никак не исправить=\


mes, Ваша программа работает, но, если я прально понял, вообще не использует библиотеку string.h


Это сообщение отредактировал(а) Winterlord - 18.3.2009, 11:55
PM MAIL ICQ   Вверх
mes
Дата 18.3.2009, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Winterlord @  18.3.2009,  10:29 Найти цитируемый пост)
 но, если я прально понял, вообще не использует библиотеку string.h

ага, ей не нашлось места в коде  smile забыл  .. точнее сказать, не вспомнил, когда писал код , что ее использование обязательно  smile 




--------------------
PM MAIL WWW   Вверх
Anikmar
Дата 18.3.2009, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну а хоть мой код работает?
PM MAIL ICQ   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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