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

Удалить пробел перед точкой - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
ViT(Vet@l)
27 / 26 / 2
Регистрация: 13.12.2010
Сообщений: 333
13.10.2011, 16:49     Удалить пробел перед точкой #1
Вводится текст - необходимо удалить все пробелы перед точкой(запятой).

Понимаю, что нужно сделать примерно так:

C++
1
2
3
4
5
6
7
8
9
10
string sentence;
 
getline(cin, sentence);
 
int i = 0;
while(sentence[i] == ' ' && sentence[i+1] == '.'){
удалить после i;
}
strstr(sentence, ' .');
и потом все объединяем в один новый массив;
Возник вопрос, как удалить часть массива после определенного условия.
пробовал
sentence.delete(i, 1);
но не катит
Подскажите, пожалуйста, что мне поможет в данной ситуации.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.10.2011, 16:49     Удалить пробел перед точкой
Посмотрите здесь:

C++ Как на языке "С" удалить в строке все цифры 3 перед первой точкой и заменить все '+' после певрой точки на '-'?
C++ Вывести на экран слова перед которыми стоят запятая и пробел.
Строка: вставить пробел перед каждой заглавной буквой C++
C++ Строки: уничтожить в строке запятые перед первой точкой, заменить знаком + все цифры 3я после первой точки
C++ классы, что пишется перед точкой с запятой?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
co6ak
Кошковед
 Аватар для co6ak
403 / 496 / 29
Регистрация: 12.04.2010
Сообщений: 1,392
13.10.2011, 16:56     Удалить пробел перед точкой #2
а обязательно в массив записывать или можно просто на экран выплюнуть?
ViT(Vet@l)
27 / 26 / 2
Регистрация: 13.12.2010
Сообщений: 333
13.10.2011, 16:59  [ТС]     Удалить пробел перед точкой #3
вообщем есть такая прога
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream>
#include <string.h>
 
using namespace std;
 
int main()
{
    string sentence;
 
    getline(cin, sentence);
 
    cout << endl;
 
    if(islower(sentence[0]) != 0){
        cout << "Nachalo pervogo predlogeniya s malenkoy bukvi!" << endl;
        sentence[0] = toupper(sentence[0]);
    }
 
    int i = 1;
  
    while(sentence[i] != '\0'){
        if((sentence[i - 1] == '.' || sentence[i - 1] == '!' || sentence[i - 1] == '?') && sentence[i] != ' ' && sentence[i] != '\0'){
            cout << i << " Otsutstvuet probel!" << endl;
            sentence.insert(i, 1, ' ');
        }
        if((sentence[i - 2] == '.' || sentence[i - 2] == '!' || sentence[i - 2] == '?')  && sentence[i - 1] == ' ' && islower(sentence[i]) != 0){
            cout << i << " Malenkaia bukva!" << endl;
            sentence[i] = toupper(sentence[i]);
        }
        if(sentence[i] != '.' && sentence[i] != ',' && sentence[i + 1] == ' ' && sentence[i + 2] == 'a' && sentence[i + 3] == ' '){
            cout << i << " Otsutstvuet zapyataya!" << endl;
            sentence.insert(i + 1, 1, ',');
        }
        if(sentence[i] != '.' && sentence[i] != ',' && sentence[i + 1] == ' ' && sentence[i + 2] == 'n' && sentence[i + 3] == 'o' && sentence[i + 4] == ' '){
            cout << i << " Otsutstvuet zapyataya!" << endl;
            sentence.insert(i + 1, 1, ',');
        }
        if(sentence[i - 1] == ',' && sentence[i] != ' '){
            cout << i << " Otsutstvuet probel posle zapyatoy!" << endl;
            sentence.insert(i, 1, ' ');
        }
        if(sentence[i] == ' ' && sentence[i+1] == '.'){
         
        }
 
 
        i++;
    }
   
    int length = 0;
 
    const char* str_ptr = sentence.c_str();
 
    length =  strlen(str_ptr);
 
    if(sentence[length - 1] != '.'){
            cout << "Otsutstvuet tochka v poslednem predlogenie!" << endl;
            sentence.insert(length, 1, '.');
    }
 
    cout << endl << sentence << endl << endl;
 
    cin.get();
 
    return 0;
}
Хочу попробовать еще реализовать вышеописанную функцию
nikola166
 Аватар для nikola166
8 / 8 / 0
Регистрация: 18.03.2010
Сообщений: 142
13.10.2011, 16:59     Удалить пробел перед точкой #4
просто скопируйте часть массива в другой массив
ViT(Vet@l)
27 / 26 / 2
Регистрация: 13.12.2010
Сообщений: 333
13.10.2011, 17:02  [ТС]     Удалить пробел перед точкой #5
Млин, а все-то на поверхности
nikola166
 Аватар для nikola166
8 / 8 / 0
Регистрация: 18.03.2010
Сообщений: 142
13.10.2011, 17:03     Удалить пробел перед точкой #6
конечно))))
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.10.2011, 17:10     Удалить пробел перед точкой #7
Цитата Сообщение от ViT(Vet@l) Посмотреть сообщение
sentence.delete(i, 1);
C++
1
sentence.erase(sentence.begin() + i);
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
13.10.2011, 17:12     Удалить пробел перед точкой #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
    std::string s = "qweqweqw , qweqweqwe    qwe   qweqwe \
qwe   . qweqwqwe . qweqweqw . qwe.,., qweqw.";
 
    std::string new_s;
 
    bool flag=false;
 
    for (std::string::reverse_iterator rit=s.rbegin(); rit!=s.rend(); rit++) {
        
        if (*rit=='.' || *rit==',') {
            flag = true;
            new_s+=*rit;
            continue;
        }
 
        if (flag) {
            if (*rit== ' ')
                continue;
        }
 
        new_s+=*rit;
        flag=false;
        
    }
 
    std::reverse(new_s.begin(),new_s.end());
 
    std::cout << new_s;
хотя можно проще.
считать пробелы и если после них идёт символ разделитель не писать их. если не символ разделитель записать их в строку.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
13.10.2011, 17:30     Удалить пробел перед точкой #9
Надо делать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
int  main(void) {
 int temp= getchar ();
 
 while (temp!= '.'&&temp!= 10) {
  if (temp!=' ')
   printf ("%c", temp);
  temp= getchar ();
 }
 
 if (temp== '.')
 while ((temp= getchar())!=10) {
  printf ("%c", temp);
 }
 
 getchar (); 
 return 0;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
13.10.2011, 17:38     Удалить пробел перед точкой #10
Цитата Сообщение от kravam Посмотреть сообщение
Надо делать так:
Код
C:\c_cpp\shitcode>kravam_point.exe
bla , bla , bla .
bla,bla,bla
Nameless One
13.10.2011, 17:43
  #11

Не по теме:

kravam, делай горизонтальные отступы больше, глаза ж сломать можно

kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
13.10.2011, 17:56     Удалить пробел перед точкой #12
Прошу прощения, надо так:
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
#include <stdio.h>
 
int main(void)
{
    int temp = getchar ();
    
    while (temp!= '.'&&temp!= 10)
    {
    if (temp!=' ')
        printf ("%c", temp);
    temp= getchar ();
    }
    
    if (temp== '.')
    {
    printf ("%c", temp);
    while ((temp= getchar())!=10)
    {
        printf ("%c", temp);
    }
    }
 
    getchar (); 
    return 0;
}
Короче я не умею код редактировать

 Комментарий модератора 
fixed
ViT(Vet@l)
27 / 26 / 2
Регистрация: 13.12.2010
Сообщений: 333
13.10.2011, 21:46  [ТС]     Удалить пробел перед точкой #13
А почему нельза вот так:
C++
1
2
3
4
5
6
if(sentence[i] == ' ' && sentence[i + 1] == '.'){
            char* strncpy(char* sentence1, const char* sentence, size_t i);
            char* strstr(char* str, char* sentence);
            char* strcat(char* sentence1, const char* sentence);
 
        }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2011, 08:28     Удалить пробел перед точкой
Еще ссылки по теме:

Из заданной пользователем строки сформулируйте новую, добавив пробел перед каждым символом строки кроме пробела C++
C++ Удалить символы, стоящие перед *
C++ отсутствие точки-запятой перед точкой (ООП)

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

Или воспользуйтесь поиском по форуму:
xAtom
 Аватар для xAtom
910 / 735 / 60
Регистрация: 09.12.2010
Сообщений: 1,346
Записей в блоге: 1
14.10.2011, 08:28     Удалить пробел перед точкой #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
#include <stdio.h>
#include <string.h>
 
char* str_erase(char* str, char ch, char* to) {
   char* tmp = str;
   int  size;
   char* sa, *sb;
   while(*str) {
        if(*str == ch) {
            for(sb = str; *sb == ch; *sb++);
            size = sb - str;
            if(strchr(to, *sb)) {
                 while(size--)
                     for(sa = str, sb = str + 1; *sa; *sa++ = *sb++);
            } else
                  str += --size;
            }
            *str++;
   }
   return tmp;
}
 
int  main(void) {
   char str[128] = "   .bla    , bla    , bla    . kop    ,";
   // gets(str);
   puts( str_erase(str, ' ', ",.") );
   getchar();
   return 0;
}
Yandex
Объявления
14.10.2011, 08:28     Удалить пробел перед точкой
Ответ Создать тему
Опции темы

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