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

Поиск:

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


Эксперт
***


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

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



Цитата

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

да надо после первого вызова strtok добавить
Код

        while ((*p))
            s[i++]=*(p++);

+ еще добавить условие конца файла, строки, но даже при таких раскладах должна работать, хоть и будет выдавать ошибку, но файл правильно заполнит... точнее, должна выдать ошибку, я не проверял...


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

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


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


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

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



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

вот с библиотекой..
Код

void fn(const char* s, char *dst)
{
     const char *begin =s; // указатель на начало строки
     const char *end   = s+strlen(s); // расчитывает указатель на конец строки

// 1
     if (*s==' ') // если первый пробел
     {
       for (const char *p=s; p && !(p-s); p=strchr(s,' '))  ++s; // то ищем где заканчиваются начальные пробелы

       strncat (dst, begin, s-begin); // и прибавляем их к результативной строке
     }  
// в результате s указывает на 1й не_пробел

// 2
      for (const char *p=s; p && p<end;) //  пока не дойдем до конца строки 
      {
           p=strchr(s,' '); // ищем где заканчиается слово
           if (p) // если найдено
           {
               strncat (dst, s, p-s); // копируме его в результативную строку
               s=p;                         // запоминаем указатель 
               for (const char *p1=p; p<end && p1 && !(p1-p); p1=strchr(p,' ')) ++p; // пропускаем все пробелы
               if (end-p) // если не вышли за конец
               {
                   s=p; //запоминаем позицию (это будет начало другого слова)
                   strcat (dst, " "); // вставляем проблел в результативную строку
               };
             };
        }
// 3
        strncat (dst, s, end-s); // копируем в результативную строку финальный (не обработанный)  кусок строки.
}

P.S. s - используется фактически как счетчик отработанных символов, p и p1 для поиска вперед. 

добавил комменты smile



Это сообщение отредактировал(а) mes - 19.3.2009, 01:18


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


Шустрый
*


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

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



Anikmar, Для меня без комментариев очень сложно понять ваш код. Если там используются флаги, то их нельзя использовать=\

mes, напишите пожалуйста хотя б поверхностные комментарии. И куда в функции мейн воткнуть dst?

Dmi3ev , теперь первое слово выводится прально, но съедаются пробелы после него, тоесть между первым и вторым и последние пробелы из исходного текста не переносятся в изменённый.

P.S. Большое спасибо, что помогаете



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


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


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

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



Цитата(Winterlord @  19.3.2009,  00:07 Найти цитируемый пост)
mes, напишите пожалуйста хотя б поверхностные комментарии. 

написал smile


Цитата(Winterlord @  19.3.2009,  00:07 Найти цитируемый пост)
И куда в функции мейн воткнуть dst?


вот пример вызова :

Код

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


  fn (s, s1);
    std::cout<<"="<<s1<<"="<<std::endl;

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



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


Эксперт
***


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

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



Цитата

Dmi3ev , теперь первое слово выводится прально, но съедаются пробелы после него, тоесть между первым и вторым и последние пробелы из исходного текста не переносятся в изменённый.

не пробелы, а один пробел! надо еще дописать после цикла:
Код

s[i++]=' ';

Проявите фантазию


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

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


Шустрый
*


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

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



mes, Большое спасибо, вроде работает, входные\выходные файлы надеюсь, что сам смогу прикрутить)

Dmi3ev, И вам большое спасибо. Да, постараюсь доделать) если не сложно, напишите пожалуйста комментарии к вашему коду, хотя б поверхностные
PM MAIL ICQ   Вверх
xvr
Дата 19.3.2009, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Еще вариант, правда без string.h, но зато с родными для Borland'а строками (AnsiString) - так, на закуску  smile
Код

AnsiString my_trim(AnsiString inp)
{
 int l=inp.Length();  inp=inp.TrimLeft();
 int left_spaces=l-inp.Length();
 l=inp.Length();  inp=inp.TrimRight();
 int righ_spaces=l-inp.Length();

 for(;;)
  {
   AnsiString s=StringReplace(inp,"  "," ",TReplaceFlags()<<rfReplaceAll);
   if (s==inp) break;
   inp=s;
  }
 return AnsiString::StringOfChar(' ',left_spaces)+inp+AnsiString::StringOfChar(' ',right_spaces);
}



Это сообщение отредактировал(а) xvr - 19.3.2009, 12:52
PM MAIL   Вверх
Anikmar
Дата 19.3.2009, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Winterlord @  19.3.2009,  01:07 Найти цитируемый пост)
Anikmar, Для меня без комментариев очень сложно понять ваш код. Если там используются флаги, то их нельзя использовать=\

А флаги почему нельзя?  smile 


На самом деле мой код от остальных отличается принципиально только тем, что он однопроходный - т.е. все идет в одном цикле. Если флаги нельзя- тогда мой код можете выкинуть.
PM MAIL ICQ   Вверх
Winterlord
Дата 21.3.2009, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Anikmar @  19.3.2009,  17:36 Найти цитируемый пост)
А флаги почему нельзя?

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


mes, Вот ваша функция мейн, только с добавленным чтением с файла:
Код

int main ()
{
  char s[100];
  int i=0;
  F.open("input2.txt", ios::in);
  P.open("output2.txt", ios::out);
  F.unsetf(ios::skipws);
   while (!F.eof())
    {
    F>>s[i];
    i++;
    } 
   cout<<endl;
      if (i==1) 
       {
       cout<<"No input information"<<endl; 
       P<<"No input information"<<endl; 
       system("pause"); 
       F.close(); P.close(); 
       return (0);
       }               
  //char s[] =  "      The    project     of     the         International     Phonematic      Alphabet      ";
  char s1[100] = { 0 };
  fn (s, s1);
    cout<<"="<<s1<<"="<<endl;
    P<<"="<<s1<<"="<<endl;
  system("pause");
  F.close(); P.close();
  return(0);
}


Как исправить такую проблему, что если ввести строку, где последние символы пробелы (хотя бы один) - то всё нормально, если же ввести строку, где последние символы не пробелы - при выводе добавляется произвольный лишний символ.
И если ввести только пробелы - выводятся пробелы - нормально, а если ввести меньше 8-ми пробелов или просто много пробелов - выводится крокозябра) Заранее благодарен.

P.S. Если компилировать на Борланде С++ 3.1, то при выводе в конце строки прибавляется крокозябра. Если компилировать в Dev C++, то только когда меньше восьми пробелов и когда их очень много.
PM MAIL ICQ   Вверх
mes
Дата 21.3.2009, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



вы считывайте из файла буфер. Чтоб этот буффер можно было считать строкой в конце должен стоять '\0'
если Вы работаете с одной строкой, которая меньше по длине, чем размер буффера, то достаточно обнулить этот буфер изначально.
стр 3:
Код

char s[100]  = { 0 };



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


Шустрый
*


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

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



mes, Большое спасибо, пока работает) воспользовался обнулением
PM MAIL ICQ   Вверх
mes
Дата 21.3.2009, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Winterlord @  21.3.2009,  20:15 Найти цитируемый пост)

  F.open("input2.txt", ios::in);
  P.open("output2.txt", ios::out);
..
  cout<<"No input information"<<endl; 
  P<<"No input information"<<endl; 

переменные F и P очень портят вид кода, Гулливер и то, имхо, смотрелся лучше.
Учитывая, что пользуетесь stl, гораздо симпатичнее смотрелись бы fin и fout.

Добавлено @ 23:27
не вытерпел, подправил код.. Вам для примера, ну а мне чтоб глаза не резал smile. В дальнейшем сами старайтесь..уважайте тех кому придется его читать smile
Код

#define BUFF_SIZE 100

int main ()
{ 
  cout<<endl;

  char s [BUFF_SIZE] = { 0 };
  char s1[BUFF_SIZE] = { 0 };

  fin.open("input2.txt", ios::in);
  fin.unsetf(ios::skipws);

  fout.open("output2.txt", ios::out);

  int readed =0;
  for (;!fin.eof() && readed<BUFF_SIZE; ++readed)    
   fin>>s[i];
  
  if (readed<=1) 
  {
      cout<<"No input information"<<endl; 
      fout<<"No input information"<<endl; 
  }               
  else 
  {
       fn (s, s1);
       cout<<"="<<s1<<"="<<endl;
       fout<<"="<<s1<<"="<<endl;
  }

  fout.close();
  fin.close();

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



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


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


Шустрый
*


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

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



mes, Огромное спасибо) Я не волшебник, а только учусь ^_^
PM MAIL ICQ   Вверх
Winterlord
Дата 23.3.2009, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Anikmar, 
Dmi3ev, 
mes, Большое вам спасибо, помогли. Сегодня сдал прогу) ^_^
PM MAIL ICQ   Вверх
Winterlord
Дата 23.3.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

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

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

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


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

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


 




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


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

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