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

Строка: вставить пробел перед каждой заглавной буквой - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.68
eugeneC+
0 / 0 / 0
Регистрация: 24.06.2012
Сообщений: 16
28.06.2012, 12:14     Строка: вставить пробел перед каждой заглавной буквой #1
Вводится строчка, например, HaveaNiceDay.
Нужно чтобы выводилось Havea Nice Day, то есть перед заглавной буквой ставится пробел. Как вставить пробел в принципе понятно, но как сдвинуть вправо на один? Если можно - не кодом, а словами, буду благодарен.

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
#include <iostream>
#include <cstring>
#include <cstdio>
 
 
using namespace std;
 
int main()
{
   int i=15;
   char mass[i];
 
   cin>>mass;
 
 
  for (i=0;i<=15;i++)
   {
 
    if (isupper(mass[i]))
     {
 
           mass[i-1]=' ';
 
     }
 
 
   }
 
   cout<<mass;
     return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.06.2012, 12:14     Строка: вставить пробел перед каждой заглавной буквой
Посмотрите здесь:

C++ Строка вводится с клавиатуры. В данной строке вставить пробел после каждого символа
C++ Перед каждой буквой третьего слова поставить '/'. Лишние символы (с 81-ого) отбросить
Строки. Вставить пробел после каждой нечетной буквы в слове C++
Вставить перед каждой серией минимальный элемент массива C++
C++ Вставить перед каждой серией минимальный элемент массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
 Аватар для Catstail
21451 / 10236 / 1667
Регистрация: 12.02.2012
Сообщений: 17,108
28.06.2012, 12:19     Строка: вставить пробел перед каждой заглавной буквой #2
Чтобы сильно не "париться" сделай так:

1) заведи второй массив бОльшего размера
2) читаешь символ за символом из исходной строки.
3) если буква строчная - просто кладешь ее во второй массив
4) если заглавная - во второй массив кладешь пробел, а за ним заглавную букву...
5) вытряхиваешь на экран второй массив

Пойдет?
eugeneC+
0 / 0 / 0
Регистрация: 24.06.2012
Сообщений: 16
28.06.2012, 12:47  [ТС]     Строка: вставить пробел перед каждой заглавной буквой #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
#include <iostream>
#include <cstring>
#include <cstdio>
 
 
using namespace std;
 
int main()
{
   int i=30;
   int n=90;
   char mass[i];
   char mass1[n];
   cin>>mass;
 
 
  for (i=0,n=0;i<=30,n<=90;i++,n++)
   {
 
    if (islower(mass[i]))
     {
 
         mass1[n]=mass[i];
 
     }
  if (isupper(mass[i]))
     {
 
 
        mass1[n]=' ';
        mass1[n+1]=mass[i];
     }
 
 
 
   }
 
   cout<<mass1;
     return 0;
}
Добавлено через 10 минут
Цитата Сообщение от Catstail Посмотреть сообщение
Чтобы сильно не "париться" сделай так:

1) заведи второй массив бОльшего размера
2) читаешь символ за символом из исходной строки.
3) если буква строчная - просто кладешь ее во второй массив
4) если заглавная - во второй массив кладешь пробел, а за ним заглавную букву...
5) вытряхиваешь на экран второй массив

Пойдет?
можешь посмотреть, где не так?
Catstail
Модератор
 Аватар для Catstail
21451 / 10236 / 1667
Регистрация: 12.02.2012
Сообщений: 17,108
28.06.2012, 12:52     Строка: вставить пробел перед каждой заглавной буквой #4
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
int main()
{
   int i;  //=30;
   int n; //=90;
   char mass[30];
   char mass1[90];
 
   cin>>mass;
 
  n=0;
  for (i=0;i<30;i++)
   {
 
    if (islower(mass[i]))
     {
 
         mass1[n++]=mass[i];
 
     }
  if (isupper(mass[i]))
     {
 
        mass1[n++]=' ';
        mass1[n++]=mass[i];
     }
  
   }
 
   cout<<mass1;
 
   return 0;
 
}
Peperovich
43 / 43 / 4
Регистрация: 17.05.2011
Сообщений: 162
28.06.2012, 12:53     Строка: вставить пробел перед каждой заглавной буквой #5
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
#include <iostream>
#include <cstring>
#include <cstdio>
#include <conio.h> 
 
using namespace std;
 
int main()
{
   int i=30;
   int n=90;
   char mass[i];
   char mass1[n];
   cin>>mass;
 
 n=0;
  for (i=0;i<=30;i++)
   {
 
    if (islower(mass[i]))
     {
 
         mass1[n]=mass[i];      n++;
 
     }
  if (isupper(mass[i]))
     {
 
 
        mass1[n]=' ';
        mass1[n+1]=mass[i];n++;n++;
     }
 
 
 
   }
 
   cout<<mass1;
     getch();
}
eugeneC+
0 / 0 / 0
Регистрация: 24.06.2012
Сообщений: 16
28.06.2012, 12:59  [ТС]     Строка: вставить пробел перед каждой заглавной буквой #6
Не понимаю в чем отличие n++ в цикле или там, где вы поставили? Поясните, пожалуйста.
Catstail
Модератор
 Аватар для Catstail
21451 / 10236 / 1667
Регистрация: 12.02.2012
Сообщений: 17,108
28.06.2012, 13:00     Строка: вставить пробел перед каждой заглавной буквой #7
Верно и так, и так. Но мой способ быстрее.
eugeneC+
0 / 0 / 0
Регистрация: 24.06.2012
Сообщений: 16
28.06.2012, 13:03  [ТС]     Строка: вставить пробел перед каждой заглавной буквой #8
Цитата Сообщение от Catstail Посмотреть сообщение
Верно и так, и так. Но мой способ быстрее.
Дело в том, что у меня, когда написано в цикле - не работает, просто затирает заглавные буквы, но не смещает. И , кстати, когда запускаешь тот код, который работает в конце еще "мусор" какой-то, в виде нескольких символов.
Peperovich
43 / 43 / 4
Регистрация: 17.05.2011
Сообщений: 162
28.06.2012, 13:07     Строка: вставить пробел перед каждой заглавной буквой #9
Цитата Сообщение от eugeneC+ Посмотреть сообщение
Дело в том, что у меня, когда написано в цикле - не работает, просто затирает заглавные буквы, но не смещает. И , кстати, когда запускаешь тот код, который работает в конце еще "мусор" какой-то, в виде нескольких символов.
Потому что, когда ты встречаешь заглавную букву, ты добавляешь в новый массив 2 символа (пробел и саму букву), значит и шаг в этом случае должен быть 2 по n, а у тебя 1. А у тебя получается что ты встречаешь заглавную букву , добавляешь в новый массив пробел и букву, прибавляешь к n 1, а значит в следующем шаге цикла ты затрешь эту же букву.
ЛетающийЕнот
88 / 67 / 12
Регистрация: 28.06.2012
Сообщений: 161
28.06.2012, 13:13     Строка: вставить пробел перед каждой заглавной буквой #10
Почему бы и не выводить тупо посимвольно?

C++
1
2
3
4
5
for (int i=0; i<strlen(s); i++)
 if (!isupper(s[i]))
  printf("%c",s[i]);
 else
  printf(" %c",s[i]);
Catstail
Модератор
 Аватар для Catstail
21451 / 10236 / 1667
Регистрация: 12.02.2012
Сообщений: 17,108
28.06.2012, 14:24     Строка: вставить пробел перед каждой заглавной буквой #11
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 "iostream.h"
#include "string.h"
#include "ctype.h"
 
int main(int argc, char* argv[])
{
 
   int i;  //=30;
   int n; //=90;
   char mass[30];
   char mass1[90];
 
   cin>>mass;
 
   n=0;
   for (i=0;i<30;i++)
   {
      if (islower(mass[i]))
      {
          mass1[n++]=mass[i];
      }
  if (isupper(mass[i]))
     {
          mass1[n++]=' ';
          mass1[n++]=mass[i];
     }
  
   }
 
   mass1[n]=0; // ÷òîáû Г*ГҐ áûëî ìóñîðГ*
 
   cout << mass1 << endl;
 
    return 0;
}
Все работает... Только нуль-символ надо было вставить.
Миниатюры
Строка: вставить пробел перед каждой заглавной буквой  
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
28.06.2012, 14:53     Строка: вставить пробел перед каждой заглавной буквой #12
Catstail, я бы рекомендовал слегка исправить:

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 "iostream.h"
#include "string.h"
#include "ctype.h"
 
int main(int argc, char* argv[])
{
 
   int i;  //=30;
   int n; //=90;
   char mass[30];
   char mass1[90];
 
   cin>>mass;
 
   n=0;
   i=0;
   
   while (mass[i]) //for (i=0;mass[i]!=0;i++)
   {
      if (islower(mass[i]))
      {
          mass1[n++]=mass[i];
      }
  if (isupper(mass[i]))
     {
          mass1[n++]=' ';
          mass1[n++]=mass[i];
     }
     i++;
   }
 
   mass1[n]=0; // чтобы не было мусора
 
   cout << mass1 << endl;
   system ("pause");
    return 0;
}
Потому как в Вашем случае не совсем корректно работает (по крайней мере у меня):
Миниатюры
Строка: вставить пробел перед каждой заглавной буквой  
Catstail
Модератор
 Аватар для Catstail
21451 / 10236 / 1667
Регистрация: 12.02.2012
Сообщений: 17,108
28.06.2012, 15:10     Строка: вставить пробел перед каждой заглавной буквой #13
А буквы русские? Тогда нужно локаль поставить. К алгоритму это не имеет отношения.
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
28.06.2012, 15:14     Строка: вставить пробел перед каждой заглавной буквой #14
Catstail,
А причем тут локаль?
Я к тому, что здесь:
Цитата Сообщение от Catstail Посмотреть сообщение
C++
1
for (i=0;i<30;i++)
нет проверки на нуль-терминатор, который сидит сразу после ввода строчки.
Catstail
Модератор
 Аватар для Catstail
21451 / 10236 / 1667
Регистрация: 12.02.2012
Сообщений: 17,108
28.06.2012, 15:17     Строка: вставить пробел перед каждой заглавной буквой #15
Локаль при том, что islower/upper русские буквы просто так обрабатывать не будет.
Что же до анализа на нуль символ - то Вы правы. Просто я хотел сказать автору, что его код вполне работоспособен.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.06.2012, 15:19     Строка: вставить пробел перед каждой заглавной буквой
Еще ссылки по теме:

C++ Дана строка латинских букв. После заглавной буквы поставить вставить эту же прописную букву и наоборот
C++ Проверить, есть ли точка с пробелом перед каждой большой буквой строки
Проверить наличие в тексте одного из знаков разделителей (“.” , ”?”, ”!”) перед каждой большой русской буквой C++

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

Или воспользуйтесь поиском по форуму:
The_Immortal
1548 / 484 / 8
Регистрация: 04.04.2009
Сообщений: 1,891
28.06.2012, 15:19     Строка: вставить пробел перед каждой заглавной буквой #16
Catstail,

Цитата Сообщение от Catstail Посмотреть сообщение
Локаль при том, что islower/upper русские буквы просто так обрабатывать не будет.
А, это да. Уже другая история. Но я на кириллице не тестил
Yandex
Объявления
28.06.2012, 15:19     Строка: вставить пробел перед каждой заглавной буквой
Ответ Создать тему
Опции темы

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