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

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

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

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

01.07.2012, 22:40. Просмотров 660. Ответов 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++
Привет всем, помогите разработать программу для удаления двойных пробелов и двойных запятых. А так же, чтобы после точки была заглавная...

Замена двойных пробелов из входного файла на одиночный пробел и запись в выходной файл (объяснить работу кода) - C++
Здравствуйте, нашла код программы, которая заменяет в файле Input.txt двойные пробелы в исходном файле на одиночные пробелы и выводит это...

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

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

Удалить группы пробелов, которыми начинается и заканчивается строка, а каждую внутреннюю группу пробелов заменить одним пробелом - C++
Задана строка символов. Преобразовать эту строку следующим образом: удалить группы пробелов, которыми начинается и заканчивается строка, а...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Aneron
158 / 157 / 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
302 / 225 / 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
228 / 71 / 16
Регистрация: 12.03.2012
Сообщений: 318
01.07.2012, 23:50 #4
Цитата Сообщение от remarkes Посмотреть сообщение
Чтобы программист, читающий ваш код не занимался телепатией

Не по теме:

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

algoritm256
9 / 9 / 1
Регистрация: 05.02.2012
Сообщений: 147
Записей в блоге: 1
01.07.2012, 23:53  [ТС] #5
Всем большое спасибо! Учту замечания!
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
01.07.2012, 23:58 #6
h3mbr0, А программист обязан помнить аски таблицу? Реально? То есть написать ' ' вместо 0x20 религия не позволяет?
h3mbr0
228 / 71 / 16
Регистрация: 12.03.2012
Сообщений: 318
02.07.2012, 00:03 #7
Цитата Сообщение от ForEveR Посмотреть сообщение
h3mbr0, А программист обязан помнить аски таблицу? Реально? То есть написать ' ' вместо 0x20 религия не позволяет?

Не по теме:

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

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

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

Поменять нахождение min среди двумерного массива, на нахождение min в каждой сточке - C++
Поменять нахождение min среди двумерного массива, на нахождение min в каждой сточке #include &lt;iostream&gt; #include &lt;cstddef&gt; #include...

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.07.2012, 01:36
Ответ Создать тему
Опции темы

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