Консультация № 182655
29.03.2011, 00:25
0.00 руб.
0 5 1
Уважаемые эксперты помогите подрправить
26. удалить в строке все знаки, входящие в заданный набор знаков.
в 3х варинантах:
1) строка символов char
2) указательный массив char*
3) использование class string
не совсем понял чем отличается 1 и 2 пункты нужна помощь я написал по чару мне сказали что надо полностью через чар, а в 3-м полностью через спринг
я не знаю где неверно всё работает но нужна помощь ..

вот через чар:
#include <iostream>
#include <string.h>
#include <conio.h>
#include <stdio.h>

#include <locale> // Подключение библиотек

using namespace std;

int i, j, l;
bool t, k;
char r;
char SimBols[128];
char IshStr[128];
char ResStr[128];

int main()
{
setlocale(LC_ALL,"russian_russia"); // Подключение русского языка.

t=true;
while(t==true)
{
cout << "Символы для удаления: " << endl;
cin >> SimBols;
cout << "Исходная строка: " << endl;
cin >> IshStr;
i = 0;
j = 0;
l = 0;
while(i < strlen(IshStr))
{
while(j < strlen(SimBols))
{

if(IshStr[i] == SimBols[j])
{
k = true;
}
j++;

}
if(k != true)
{
ResStr[l] = IshStr[i];
l++;
}
i++;
k = false;
j=0;
}

cout << "Результат: " << ResStr << endl;
cout << " Хотите попробовать ещё раз? Введите y, если да." << endl;
cin >> r;
if (r==121)
{
system("cls");
t=true;
}
else
{
t=false;
}

}
_getch();
}

вот через спринг:
#include <iostream>
#include <string.h>
#include <conio.h>
#include <stdio.h>

#include <locale> // Подключение библиотек

using namespace std;

int i;
bool t;
string ResStr, Sim;

int main()
{
setlocale(LC_ALL,"russian_russia"); // Подключение русского языка.
{
cout << "Символы для удаления: " << endl;
getline(cin, Sim);
cout << "Исходная строка: " << endl;
getline(cin, ResStr);
i = 0;
while(i < Sim.length())
{
while(ResStr.find(Sim.at(i)) != string::npos)
{

ResStr.erase(ResStr.find(Sim.at(i)), 1);

}
i++;
}

cout << "Результат: " << ResStr << endl;

cin >> r;

}
_getch();
}

Обсуждение

давно
Академик
320937
2216
29.03.2011, 09:37
общий
это ответ
Здравствуйте, Посетитель - 367730! Пример ответа на 1й вопрос. G++/Code::Blocks.
Код:
#include <stdio.h>
/* Б. Керниган, Д. Ритчи. Язык программирования Си */
/* Упражнение 2.4. */
/* Напишите альтернативную версию функции squeeze(s1, s2), */
/* которая бы удаляла из строки s1 все символы, встречающиеся */
/* в строке s2. */
/* 13 сентября 2010, Ковров */

void squeeze(char s1[], const char s2[]);
int main(void)
{
char s1[]="we must study C language";
char s2[]="sam";

printf("s1=%s, s2=%s\n", s1, s2);
squeeze(s1, s2);
printf("s1=%s\n", s1);

return 0;
}

void squeeze(char s1[], const char s2[])
{
int i, j, k;
for (i=0, j=0; s1[i]!='\0'; ++i)
{
for (k=0; s2[k]!='\0' && s1[i]!=s2[k]; ++k)
;
if (s1[i]!=s2[k])
s1[j++]=s1[i];
}
s1[j]='\0';
}

Пример вывода
Код:
s1=we must study C language, s2=sam
s1=we ut tudy C lnguge

Если требуются пояснения, задавайте вопросы в мини-форуме. Удачи!
Неизвестный
29.03.2011, 09:40
общий
Думаю кроме вашего преподавателя никто не сможет точно объяснить, чем отличаются 1-й и 2-й варианты. Я могу сделать предположение, что в первом варианте надо работать с индексами массива символов, а во втором - с указателями на элементы массива символов.

Вашу реализацию варианта через стринг можно значительно упростить, если использовать функцию size_type string::find_first_of(const char* _Ptr, size_type _Off = 0) const;
давно
Академик
320937
2216
29.03.2011, 10:34
общий
Вариант ответа на 2й вопрос.
Код:
#include <stdio.h>

void squeeze_ptr(char *s1, char *s2);
int main(void)
{
char s1[]="we must study C language";
char *s2="sam";

printf("s1=%s, s2=%s\n", s1, s2);
squeeze_ptr(s1, s2);
printf("s1=%s\n", s1);

return 0;
}

void squeeze_ptr(char *s1, char *s2)
{
int i, j, k;
for (i=0, j=0; *(s1+i)!='\0'; ++i)
{
for (k=0; *(s2+k)!='\0' && *(s1+i)!=*(s2+k); ++k)
;
if (*(s1+i)!=*(s2+k))
{
*(s1+j)=*(s1+i);
j++;
}
}
*(s1+j)='\0';
}

Неизвестный
29.03.2011, 13:50
общий
спасибо всем за помощь) но я сам уже допилил как делать)
Неизвестный
29.03.2011, 18:35
общий
Скорее всего под строкой символов char преподаватель имел ввиду массив
char cStr[64];
Здесь всегда можно сказать чему равен размер массива
int size = sizeof(cStr);

Указатели обычно указывают на некоторый массив, например инициализированный с помощью выделения памяти new
int pSize = 64;
char * pcStr = new char[pSize];
...
delete[] pcStr;

Здесь всегда необходимо помнить размер выделенной памяти для контроля правильности доступа, чтобы не выходить за границу выделенной области.
Форма ответа