Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.54/125: Рейтинг темы: голосов - 125, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 22

Удаление определенных букв из строки

11.01.2015, 15:24. Показов 24593. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!
Помогите, пожалуйста, с заданием! Буду очень благодарен!
Дано задание: написать функцию, чтобы из строки, которую мы введем, удалялись все буквы J…Z(j…z).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
char* Delete(char *s1,int i)
    {
        for(i=0; s1[i]!='\0' ;i++);
        s1[i--]='\0';
        return s1;
}
char* Del_useless(char *s) 
{
 for(int k=0;*(s+k);k++)
   { 
     if(((*(s+k)<65)||(*(s+k)>73))&& 
       ((*(s+k)<97)||(*(s+k)>105))) 
       { 
         s=Delete(s,k); 
     k--; 
       } 
   } 
 return s;
}
Здесь ошибка в функции Delete, но как ее исправить, я не понимаю. Пробовал разные варианты и это один из них, но функция все равно не работает.
Я так понял, что есть какое-то слово, внутри него есть буква, которую мы должны удалить. Мы ее удаляем и сдвигаем все оставшиеся буквы. Звучит, вроде, просто, но написать не получается.

Помогите, пожалуйста! Очень надо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.01.2015, 15:24
Ответы с готовыми решениями:

Удаление определенных цифр из строки
Всем привет. Интересная задачка попалась, сижу, думаю. Пользователь вводит цифровой набор, к примеру, 565471236109. Из этой строчки...

Удаление из строки определенных символов
Подскажите плиз функцию которая удаляет с строки символы. Например ввели символ А и с строки str удалилися все символы А... Если...

Удаление заглавных букв из строки
Помогите, пожалуйста, написать программу: &quot;Удалить из введенной пользователем строки все заглавные буквы.&quot; Заранее большое...

35
542 / 163 / 79
Регистрация: 23.09.2013
Сообщений: 316
11.01.2015, 18:36
Студворк — интернет-сервис помощи студентам
kruger911, Вы ко мне обращались? Возможно я не совсем верно понял то, какая функциональность требуется. Я сделал так что из строки удаляются вхождения букв, которые указаны, а остальная часть зануляется.
0
1 / 1 / 0
Регистрация: 25.03.2014
Сообщений: 29
11.01.2015, 18:38
Цитата Сообщение от kruger911 Посмотреть сообщение
есть мнение, что конструкция функции char* Del_useless(char *s) не будет отбирать символы J..Z(j..z), а будет делать ровно наоборот. Вы эту функцию сами написали?
Да, там все символы удаляются. Недосмотр.
0
0 / 0 / 1
Регистрация: 26.02.2014
Сообщений: 5
11.01.2015, 18:41
2Melg: нет обращался к ТС

2Водяной: у вас в задании
удалялись все буквы J…Z(j…z)
. А функция отбирает всё кроме этих символов и запускает функцию удаления. Может быть я не понял логику вашей функции удаления...
0
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 22
11.01.2015, 18:54  [ТС]
Или мы оба чего-то не понимаем, или кто-то один, потому что я ошибки не вижу…
Но могу ошибаться.

Добавлено через 6 минут
*(s+k)<65)-все, что меньше А
(*(s+k)>73) - все, что больше I
(*(s+k)<97)- все, что меньше a
(*(s+k)>105)- i все, что больше
Это включает и буквы и цифры и знаки.
0
1 / 1 / 0
Регистрация: 25.03.2014
Сообщений: 29
11.01.2015, 18:54
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include <iostream>
#include <string>
#include <locale.h>
 
//Функция нахождения длины строки
int length(char *s)
{
 char *temp=s;
 while(*temp++);
 return temp-s;
}
//Функция копирования строк
void Copy(char *s1, char *s2)
{
  do
   *s2++=*s1;
  while (*s1++);
}
/* 19
 * Преобразование строчного символа латинского
 * алфавита в его заглавный эквивалент.
 * 22
 * Возвращает заглавных эквивалент символа chr
 *24
 * Если преобразование невозможно, возвращает
 * исходный символ chr
*/
char* UpChar(char *s)
{
 for(int i=0;*(s+i);i++)
   if ((*(s+i)<=105)&&(*(s+i)>=97)) *(s+i)-=32;
 return s;
}
// Сортировка строки пузырьком по возрастанию
char* Sorting(char *s)
{
        int flag;
 char r;
 do
 { flag=0;
   for(int k=0;*(s+k);k++)
   {
     if (*(s+k+1))
       {
         if (*(s+k)>*(s+k+1))
         {
           r=*(s+k);
           *(s+k)=*(s+k+1);
           *(s+k+1)=r;
           flag++;
         }
       }
   }
 }
 while(flag!=0);
 return s;
}
// Удаление ненужных символов в строке
//ничего не возвращаем (возвращаем void), string передаётся по указателю, так проще
void Delete(char *string, int deleteIndex)
{
//для удобочитаемости
const char END = '\0';
 
//переменная для текущего значения индекса инициируется значением с которого начинается смещение
int currentIndex = deleteIndex;
 
        //пока текущий символ не есть символом окончания строки...
        while( string[ currentIndex ] != END )
        {
            //переместить следущее значение в текущее, начиная с указанного к удалению
            string[ currentIndex ] = string[ currentIndex+1 ];
                        //переход к следующему элементу
            currentIndex ++;
        }
}
//-------------------------------------------------------------------------------------------------------------
 
//вынести в отдельную ф-ю опеределения является ли символ буквой A-I
bool isAlpha16(char testChar )
{
    if ( ( (testChar > 64) && (testChar < 77) )
    ||
         ( (testChar > 96) && (testChar < 106) ) )
    {
        return true;
    } else {
        return false;
    }
}
 
//-------------------------------------------------------------------------------------------------------------
 
char* Del_useless(char *string)
{
const char END = '\0';
int index = 0;
 
    //до тех пор пока не наткнёмся на символ окончания строки
    while( string[ index ] != END )
    {
         if ( ! isAlpha16(string[index]) )
         {
            //удалить символ с указанной строки. Так как строка передаётся по указателю
            //все действия для этой переменной (string) будут производится напрямую
            //с переменной через указатель, а не с внутренней копией функции.
             Delete(string, index);
            //если мы удалим символ, его мето займёт следующий, не надо инкрементировать индекс
         }else
         {
            //иначе прирастить индекс, (пропустить этот символ без изменений)
            index ++;
         }
    }
    return string;
}
 
/*
 * Преобразование латинских символов
 * в символьные значение их порядковых номера в алфавите.
 * возвращает преобразованную строку s.
*/
char* Zamena( char *s)
{
//*** запомнить указатель на первый символ
char * first = s;
 
    while(*s)
    {
        if(*s >= 'A' && *s <= 'I')
        {
            *s = *s-'A' + 1 + '0';
        }
        else
        {
            if(*s >= 'a' && *s <= 'i')
            {
                *s = *s-'a' + 1 + '0';
            }
        }
        s++;
    }
    return first;
}
 
 int main()
{
    setlocale(LC_ALL, "rus");
    char *s = "";
    cout<<"Введите строку:";
    cin>>s;
    s=Del_useless(s);
    cout << "\r\n";
    cout << "Ваш результат Del_useless: ";
    cout << s;
    s=UpChar (s);
    cout << "\r\n";
    cout << "Ваш результат UpChar: ";
    cout << s;
    s=Zamena(s);
    cout << "\r\n";
    cout << "Ваш результат Zamena: ";
    cout << s;
    s=Sorting (s);
    cout << "\r\n";
    cout << "Ваш результат Sorting: ";
    cout << s;
    cin>>s;
    return 0;
}
0
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 22
11.01.2015, 18:56  [ТС]
А если уровень попроще, то как сделать?
0
1 / 1 / 0
Регистрация: 25.03.2014
Сообщений: 29
11.01.2015, 18:59
только поменять местами ф-и вывод сортировки и замены

Добавлено через 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
int main()
{
    setlocale(LC_ALL, "rus");
    char *s = "";
    cout<<"Введите строку:";
    cin>>s;
    s=Del_useless(s);
    cout << "\r\n";
    cout << "Ваш результат Del_useless: ";
    cout << s;
    s=UpChar (s);
    cout << "\r\n";
    cout << "Ваш результат UpChar: ";
    cout << s;
    s=Sorting (s);
    cout << "\r\n";
    cout << "Ваш результат Sorting: ";
    cout << s;
    s=Zamena(s);
    cout << "\r\n";
    cout << "Ваш результат Zamena: ";
    cout << s;
    cin>>s;
    return 0;
}
0
0 / 0 / 1
Регистрация: 26.02.2014
Сообщений: 5
11.01.2015, 19:06
2Водяной: вот ваше условие отбора для удаления символа
C++
1
2
3
4
5
6
if(((*(s+k)<65)||(*(s+k)>73))&& 
       ((*(s+k)<97)||(*(s+k)>105))) 
       { 
         s=Delete(s,k); 
     k--; 
       }
Оно будет выполняться, если код символа: (меньше 65 или больше 73) и (меньше 97 или больше 105). А вам же нужно удалять "J…Z(j…z)" т.е. символы с кодами 73<X<91 или 105<X<123
таблица символов: http://cppstudio.com/post/276//
0
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 22
11.01.2015, 19:07  [ТС]
Запускается, но после введения строки пишет: "необработанные исключения. попытка чтения или записи в защищенную память".
0
1 / 1 / 0
Регистрация: 25.03.2014
Сообщений: 29
11.01.2015, 19:15
Я не знаю почему так, у меня работает на XE7. Скажите программу какой пользуетесь, может кто нибуть подскажет.
0
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 22
11.01.2015, 19:33  [ТС]
Может быть дело в том, что у меня Visual Studio 2010 стоит на XP?

Добавлено через 13 минут
Цитата Сообщение от kruger911 Посмотреть сообщение
Оно будет выполняться, если код символа: (меньше 65 или больше 73) и (меньше 97 или больше 105). А вам же нужно удалять "J…Z(j…z)" т.е. символы с кодами 73<X<91 или 105<X<123
тогда , если мы введем какие-то символы, то они не удаляться.
0
1 / 1 / 0
Регистрация: 25.03.2014
Сообщений: 29
11.01.2015, 20:05
Не удалятся никакие.

Можно выбрать A-I, a-i.

И удалить всё остальное что не войдёт в это множество.

C++
1
2
3
4
5
bool charIsHex = ( ( *(s+k) > 64 ) && ( *(s+k)  < 77 ) ) ||  ( ( *(s+k) > 96 ) || ( *(s+k) <106 ) );
if ( !charIsHex  ) 
{ 
      //удалить символ
}
0
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 22
11.01.2015, 20:25  [ТС]
Цитата Сообщение от Виктор Гор Посмотреть сообщение
Можно выбрать A-I, a-i.
И удалить всё остальное что не войдёт в это множество.
Код C++
bool charIsHex = ( ( *(s+k) > 64 ) && ( *(s+k) *< 77 ) ) || *( ( *(s+k) > 96 ) || ( *(s+k) <106 ) );
if ( !charIsHex *)
{
* * * //удалить символ
}
То есть поменять в bool только условие, а остальное оставить?

Добавлено через 5 минут
Цитата Сообщение от Виктор Гор Посмотреть сообщение
if ( ! isAlpha16(string[index]) )
А что здесь за условие?

Добавлено через 7 минут
Установил на Windows 7, все равно пишет, что необработанное исключение
0
102 / 44 / 18
Регистрация: 08.01.2015
Сообщений: 97
11.01.2015, 20:27
Цитата Сообщение от Водяной Посмотреть сообщение
написать функцию, чтобы из строки, которую мы введем, удалялись все буквы J…Z(j…z).
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
void FuncDel( char * str)
    {   
        char * i;
         for ( i = str; *i != '\0'; i++)
           if(  *i < 'J' ||  *i > 'Z'  &&
                *i < 'j' ||  *i > 'z' )
               {
                  *str =  *i;
                  str++;
               }
        *str = '\0';
    }
 
int main(int argc, char *argv[])
    {
     char str[256];
 
    std::cout <<"Enter string  :" << std::endl; 
    std::cin.getline(str,256);
 
    FuncDel( str);
    std::cout <<  str  << "\n";
     
    system("PAUSE");
    return EXIT_SUCCESS;
}
1
0 / 0 / 0
Регистрация: 28.12.2014
Сообщений: 22
11.01.2015, 20:51  [ТС]
Большое спасибо! У меня программа заработала правильно!
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <iostream>
#include <cstring>
#include <algorithm>
#include <assert.h>
using namespace std;
//Функция нахождения длины строки
int length(char *s)
{
 char *temp=s;
 while(*temp++);
 return temp-s;
}
//Функция копирования строк
void Copy(char *s1, char *s2)
{
  do
   *s2++=*s1;
  while (*s1++);
}
/* 19
 * Преобразование строчного символа латинского
 * алфавита в его заглавный эквивалент.
 * 22
 * Возвращает заглавных эквивалент символа chr
 *24
 * Если преобразование невозможно, возвращает
 * исходный символ chr
*/
char* UpChar(char *s)
{
 for(int i=0;*(s+i);i++)
   if ((*(s+i)<=105)&&(*(s+i)>=97)) *(s+i)-=32;
 return s;
}
// Сортировка строки пузырьком по возрастанию
char* Sorting(char *s)
{
        int flag;
 char r;
 do
 { flag=0;
   for(int k=0;*(s+k);k++)
   {
     if (*(s+k+1))
       {
         if (*(s+k)>*(s+k+1))
         {
           r=*(s+k);
           *(s+k)=*(s+k+1);
           *(s+k+1)=r;
           flag++;
         }
       }
   }
 }
 while(flag!=0);
 return s;
}
// Удаление ненужных символов в строке
//ничего не возвращаем (возвращаем void), string передаётся по указателю, так проще
 
 void FuncDel( char * str)
    {   
        char * i;
         for ( i = str; *i != '\0'; i++)
           if(  *i < 'J' ||  *i > 'Z'  &&
                *i < 'j' ||  *i > 'z' )
               {
                  *str =  *i;
                  str++;
               }
        *str = '\0';
    }
 char* Zamena( char *s)
{
//*** запомнить указатель на первый символ
char * first = s;
 
    while(*s)
    {
        if(*s >= 'A' && *s <= 'I')
        {
            *s = *s-'A' + 1 + '0';
        }
        else
        {
            if(*s >= 'a' && *s <= 'i')
            {
                *s = *s-'a' + 1 + '0';
            }
        }
        s++;
    }
    return first;
}
 
 
int main()
    {
         setlocale(LC_ALL, "rus");
         char str[256];
    cout <<"Введите строку:" << endl; 
    cin.getline(str,256);
    FuncDel( str);
    UpChar (str);
    Zamena(str);
    Sorting (str);
    cout <<  str  << "\n";
     
    return 0;
}
0
0 / 0 / 0
Регистрация: 22.01.2013
Сообщений: 30
26.03.2016, 15:27
Вроде подходящая тема, напишу и я тут.

Итак, мне нужно удалить из полученной текстовой строки определённый набор символов.

Часть кода:
C++
1
2
3
4
......
parser_text.Delete(1, parser_text.Pos("<strong>") + 7);
Current_package_service = parser_text.SubString(1, parser_text.Pos("</strong>") - 1);
........
В переменную parser_text "заливается" определённая web-страница (кабинет пользователя). Потом из неё последовательно вынимаются необходимые текстовые данные, и присваиваются соответствующим переменным.

Благодаря криворуким программистам нашего недопровайдера код этой страницы недавно изменился, и там "нарисовались" лишние символы - пустой DIV, который мне всё сбивает.

Переменная Current_package_service на данный момент содержит текст: "(256 Kb/c) <div>\r\n </div> "
Вот мне и нужно удалить эти дивы из переменной, чтобы осталось только обозначение скорости.

Кто подскажет как это сделать проще всего?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.03.2016, 15:27

Удаление гласных букв из строки
Удалить все гласные буквы из строки. #include &quot;pch.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;Windows.h&gt; using...

Удаление букв из строки с буквами и цифрами
как удалить букву из ряда цифр например: 1123123ы84750щ13498м93 =&gt; 1123123847501349893

Удаление из строки s все последовательности трёх букв ABC
Только начал освоивать язык С и не могу выполнить задачу Нужно удалить из строки символов s все последователности трёх латинских букв ABC...

Написать функцию, принимающую указатель на строку и выполняющую удаление всех букв «а» из строки
Написать функцию, принимающую указатель на строку и выполняющую удаление всех букв «а» из строки

Посчитать количество определенных букв в двумерном динамическом массиве
Дана символьная квадратная матрица порядка n. Посчитать количество букв &quot;а&quot; надо главной диагональю и количество букв &quot;b&quot; под...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru