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

Нахождение двойных пробелов - C++

Восстановить пароль Регистрация
 
algoritm256
 Аватар для algoritm256
9 / 9 / 1
Регистрация: 05.02.2012
Сообщений: 147
Записей в блоге: 1
01.07.2012, 22:40     Нахождение двойных пробелов #1
Здравствуйте! Задача такова: Во всем тексте вставить переход на новую строку там, где есть два или больше пробела подряд

Вот мой код:

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
 
int task()
{
  FILE *in, *out;
  char p;
  int i;
  i=0;
 
  if ((in = fopen("D:\\LABS_C\\13\\1.txt", "rt"))== NULL)
  {
   fprintf(stderr, "Cannot open input file.\n");
   return 1;
  }
 
  if ((out = fopen("D:\\LABS_C\\13\\2.txt", "wt"))== NULL)
  {
   fprintf(stderr, "Cannot open output file.\n");
   return 1;
  }
 
  while (!feof(in))
  {
     p=fgetc(in);
    if(p==0x20 && p++==0x20)
    {
       p='\n';
    }
    fputc(p, out);
  }
  fclose(in);
  fclose(out);
  cout<<"Complete!!!";
 return 0;
}
 
int main()
{
        clrscr();
    task();
 
    getch();
    return 0;
}
Компилятор: Borland C++ v.3.1

Проблема в том, что он переносит даже то, где стоит один пробел. Покажите пожалуйста где ступил. Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2012, 22:40     Нахождение двойных пробелов
Посмотрите здесь:

Экранирование двойных кавычек C++
удаление двойных пробелов в с++ C++
Удалить группы пробелов, которыми начинается и заканчивается строка, а каждую внутреннюю группу пробелов заменить одним пробелом C++
Замена двойных пробелов из входного файла на одиночный пробел и запись в выходной файл (объяснить работу кода) C++
C++ Если предложение начинается с пробелов, считать строку после пробелов. Правильно ли работает функция?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Aneron
 Аватар для Aneron
157 / 156 / 12
Регистрация: 20.04.2010
Сообщений: 570
01.07.2012, 22:58     Нахождение двойных пробелов #2
C++
1
2
3
4
5
p=fgetc(in);
if(p==0x20 && p++==0x20)
{
       p='\n';
}
тут.
C++
1
2
3
4
5
6
7
8
9
10
int i = 0;
 
while (1)
{
i = 0;
while((p=fgetc(in)) == ' ')++i;
if(i > 1)p='\n';
fputc(p, out);
if(p == EOF)break;
}
remarkes
300 / 223 / 13
Регистрация: 01.07.2011
Сообщений: 809
Записей в блоге: 1
01.07.2012, 23:31     Нахождение двойных пробелов #3
algoritm256, хотел добавить на будущее вам по поводу написания красивого кода.
Чтобы программист, читающий ваш код не занимался телепатией, пытаясь понять, что за 0x20, лучше ее вначале кода объявить константой или макросом (как душе угодно), а ниже в коде уже использовать вменяемое имя. Например,
C
1
2
3
4
5
6
7
8
#define PROBEL 0x20
 
// некий код
// ....
 
if (p = PROBEL) {
        // что-то делаем
}
Так гораздо легче понимать код.
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
01.07.2012, 23:50     Нахождение двойных пробелов #4
Цитата Сообщение от remarkes Посмотреть сообщение
Чтобы программист, читающий ваш код не занимался телепатией

Не по теме:

Что это за программист не знающий что такое 0x20?)

algoritm256
 Аватар для algoritm256
9 / 9 / 1
Регистрация: 05.02.2012
Сообщений: 147
Записей в блоге: 1
01.07.2012, 23:53  [ТС]     Нахождение двойных пробелов #5
Всем большое спасибо! Учту замечания!
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.07.2012, 23:58     Нахождение двойных пробелов #6
h3mbr0, А программист обязан помнить аски таблицу? Реально? То есть написать ' ' вместо 0x20 религия не позволяет?
h3mbr0
8 / 8 / 0
Регистрация: 12.03.2012
Сообщений: 125
02.07.2012, 00:03     Нахождение двойных пробелов #7
Цитата Сообщение от ForEveR Посмотреть сообщение
h3mbr0, А программист обязан помнить аски таблицу? Реально? То есть написать ' ' вместо 0x20 религия не позволяет?

Не по теме:

А я и не спорил с этим, но ведь пробел каждый день встречается, в той же браузерной строке как %20, и ASCII знать вовсе не обязатяльно, я вот ее вообще не знаю)

alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
02.07.2012, 01:28     Нахождение двойных пробелов #8
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
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <fstream>
#include <string>
#include <iterator>
#include <iostream>
#include <algorithm>
 
template <typename Iterator>
class RemoveExtraSpacesFunctor {
public:
  RemoveExtraSpacesFunctor(Iterator _it) : state(AFTER_NON_SPACE), it(_it) {}
  void operator()(const char sym) { 
    bool space = is_space(sym);
    if (state == AFTER_NON_SPACE) {
        state = space ? AFTER_SPACE : AFTER_NON_SPACE;
    } else {
        if (space) return; 
        else state = AFTER_NON_SPACE;
    }
    *it++ = sym;
  }
  static bool is_space (const char sym) {
    return isspace(sym) && sym != '\n';
  } 
private:
  enum State { AFTER_SPACE, AFTER_NON_SPACE } state;
  Iterator it;
};
 
int main() {
  std::ifstream f1 ("3.cpp");
  std::ofstream f2 ("2.txt");
  RemoveExtraSpacesFunctor<std::ostream_iterator<char> > it = std::ostream_iterator<char>(f2);
  f1 >> std::noskipws;
  std::for_each  (std::istream_iterator<char>(f1), 
                  std::istream_iterator<char>(),
                  it); 
}
Добавлено через 14 минут
хотя можно так, правда тут наверно дек вместо вектора стоит взять

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
25
26
27
28
29
30
31
32
33
34
35
#include <fstream>
#include <vector>
#include <iterator>
#include <iostream>
#include <algorithm>
 
class IsExcessSymbol {
public:
  bool operator()(const char sym) { 
    bool space = is_space(sym);
    if (state == AFTER_NON_SPACE) {
        state = space ? AFTER_SPACE : AFTER_NON_SPACE;
    } else {
        if (space) return true; 
        else state = AFTER_NON_SPACE;
    }
    return false;
  }
  static bool is_space (const char sym) {
    return isspace(sym) && sym != '\n';
  } 
private:
  enum State { AFTER_SPACE, AFTER_NON_SPACE } state;
};
 
int main() {
  std::ifstream f1 ("3.cpp");
  std::ofstream f2 ("2.txt");
  std::vector<char> tmp;
  f1 >> std::noskipws;
  
  std::copy (std::istream_iterator<char>(f1), std::istream_iterator<char>(), std::back_inserter(tmp));
  tmp.erase(std::remove_if(tmp.begin(), tmp.end(), IsExcessSymbol()), tmp.end());
  std::copy (tmp.begin(), tmp.end(), std::ostream_iterator<char>(f2));
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.07.2012, 01:33     Нахождение двойных пробелов #9
C++
1
2
3
4
5
6
7
8
9
10
11
#include <boost/regex.hpp>
 
#include <string>
#include <iostream>
 
int main()
{
   std::string s = "hello   and what  is it    now";
   s = boost::regex_replace(s, boost::regex("\\s{2,}"), "\n");
   std::cout << s << std::endl;
}
http://liveworkspace.org/code/36c1fc...a762f6e628f802
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
02.07.2012, 01:33     Нахождение двойных пробелов #10
ForEveR, бгг)) неплохо
эта задача сводится к мини-конечному автомату
регулярные выражения по сути его и задают - так что это правильное решение
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2012, 01:36     Нахождение двойных пробелов
Еще ссылки по теме:

C++ Поменять нахождение min среди двумерного массива, на нахождение min в каждой сточке
Операции с текстом (длина, кол-во слов, кол-во двойных пробелов) C++
C++ Массив двойных слов C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
02.07.2012, 01:36     Нахождение двойных пробелов #11
Хотя правильнее пожалуй так.

C++
1
2
3
4
5
6
7
8
9
10
11
#include <boost/regex.hpp>
 
#include <string>
#include <iostream>
 
int main()
{
   std::string s = "hello   and what  is it    now";
   s = boost::regex_replace(s, boost::regex(" {2,}"), "\n");
   std::cout << s << std::endl;
}
http://liveworkspace.org/code/58cff6...61ae61a60fbcae
Yandex
Объявления
02.07.2012, 01:36     Нахождение двойных пробелов
Ответ Создать тему
Опции темы

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