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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
algoritm256
9 / 9 / 1
Регистрация: 05.02.2012
Сообщений: 147
Записей в блоге: 1
#1

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

01.07.2012, 22:40. Просмотров 647. Ответов 10
Метки нет (Все метки)

Здравствуйте! Задача такова: Во всем тексте вставить переход на новую строку там, где есть два или больше пробела подряд

Вот мой код:

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++
Здравствуйте, нашла код программы, которая заменяет в файле Input.txt двойные пробелы в исходном файле на одиночные пробелы и выводит это...

Операции с текстом (длина, количество слов, количество двойных пробелов) - C++
Составить программу, позволяющую для строки , введенного пользователем , определять : ( 1) его длину ; (2) количество слов ; (3)...

Если предложение начинается с пробелов, считать строку после пробелов. Правильно ли работает функция? - C++
Скажите пожалуйста правильно ли я написала функцию которая: если предложение начинается с пробелов она считывает строку после пробелов то...

Массив двойных слов C++ - C++
Есть массив двойных слов, подскажите пожалуйста что у него является младшим словом, а что старшим и как массив WORD перезаписать в массив...

Экранирование двойных кавычек - C++
как в с++ записать в текстовый файл символ двойных кавычек с помощью myfile понимаю что нужно их как то экранировать но как ? инфы не...

удаление пробелов - C++
предложите 2 варианта функции, удаляющей из строки ведущие и концевые пробелы

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
301 / 224 / 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
205 / 48 / 8
Регистрация: 12.03.2012
Сообщений: 276
01.07.2012, 23:50     Нахождение двойных пробелов #4
Цитата Сообщение от remarkes Посмотреть сообщение
Чтобы программист, читающий ваш код не занимался телепатией

Не по теме:

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

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

Не по теме:

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

alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
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
В астрале
Эксперт С++
7967 / 4729 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
02.07.2012, 01:33     Нахождение двойных пробелов #10
ForEveR, бгг)) неплохо
эта задача сводится к мини-конечному автомату
регулярные выражения по сути его и задают - так что это правильное решение
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.07.2012, 01:36     Нахождение двойных пробелов
Еще ссылки по теме:

Удаление пробелов - C++
Доброго времени суток ув. форумчане! Дали задание до 6.11, вчера вроде понял как делать, а сегодня что-то голова не варит. В общем сама...

количество пробелов - C++
Написал программу а она у меня не считает количество пробелов запятые считает нормально а пробелы нет. #include &lt;iostream&gt; using...

Удаление пробелов - C++
Нужна программа , которая удаляет все пробелы в строке! Помогите пожалуйста!

Ввод пробелов - C++
Задание: дано предложение, оканчивающееся точкой. Найти количество слов в предложении. Вот решение: int word_count = 0; ...

Удаление пробелов - C++
Помогите пожалуйста доделать программу(удаление пробелов в начале и в конце строки). Само задание:Удаление лишних пробелов в строке...


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

Или воспользуйтесь поиском по форуму:
ForEveR
В астрале
Эксперт С++
7967 / 4729 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 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     Нахождение двойных пробелов
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru