Консультация № 183623
14.06.2011, 16:12
58.60 руб.
0 13 1
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:

1. Написать аналог процедуры Insert. Процедурой Delete и функцией Copy не пользоваться.

сама функция есть а вот как ее прикрутить к программе вопрос. самый простой пример работы этой функции в программе нужен )
Код:


void Insert (const char *what, char *&str, int whr)
{
char* buf;
int l1 = strlen (what);
int l2 = strlen (str);
buf = new char [l1+l2+2];
for (int i=0; i<whr; i++) buf [i]= str[i];
for (int i=0; i<l1; i++)
buf [i+whr] = what [i];
for (int i=whr+l1; i<l1+l2; i++) buf [i]= str[i-l1];
//buf [l1+l2] = delete [] str;
str = NULL;
str = new char [l1+l2+2];
strcpy (str, buf);
}



2. Разработать функцию Add(const S1,S2:string):string, дописывающую все гласные латинские буквы из строки S1 в конец S2 и выдающей получившуюся строку в качестве результата. С помощью данной функции в каждую строку из введенного набора дописать все гласные латинские буквы из предыдущей строки. Гласными считаются следующие буквы: aeiouyAEIOUY.

желательно на C:

Обсуждение

Неизвестный
14.06.2011, 16:59
общий
Код:

#include <iostream.h>
#include <conio.h>
#include <string.h>

void Insert (const char *what, char *&str, int whr) //Вставка подстроки what на заданную позицию whr в str
{
char* buf; //Буфер для работы со строкой
int l1 = strlen (what);
int l2 = strlen (str);
buf = new char [l1+l2+2];
for (int i=0; i<whr; i++) buf [i]= str[i]; //Копируем в буфер часть строки до заданной позиции
for (int i=0; i<l1; i++)
buf [i+whr] = what [i]; //Пишем в буфер подстроку
for (int i=whr+l1; i<l1+l2; i++) buf [i]= str[i-l1]; //Дописываем в конец буфера остаток исходной строки
// buf [l1+l2] = delete [] str; //Освобождаем память (необходимо только при работе с динамической строкой)
str = NULL;
str = new char [l1+l2+2]; //Перевыделяем память под новую длину строки
strcpy (str, buf); //Переписываем буфер в исходную строку
}





main(void)
{
//создаем строку и заполняем ее
char *str = new char[100];
strcpy(str,"name");

//вставляем строку
Insert("is ",str,1);


cout << str << endl;
getch();

return 0;
}




вот так что то похожее на каменный цветок выходит но неправильно )
давно
Профессор
230118
3054
14.06.2011, 17:52
общий
Подправила строчку и добавила одну.
for (int i=whr+l1-1; i<l1+l2; i++) buf [i]= str[i-l1]; //Äîïèñûâàåì â êîíåö áóôåðà îñòàòîê èñõîäíîé ñòðîêè
buf [l1+l2]='\0';
Так должно работать. Попробуйте.
Неизвестный
14.06.2011, 18:01
общий
14.06.2011, 18:04
Вот, только, так реализованная ф-я и примененная в Вашей же ф-ии main() сразу порождает утечку памяти. Некрасиво. Да и С++ это.
Неизвестный
14.06.2011, 18:05
общий
Адресаты:
Да точно буфер не чистился! спасибо!

давно
Профессор
230118
3054
14.06.2011, 18:10
общий
Не буфер, а пропускался 1 символ.
Неизвестный
14.06.2011, 18:10
общий
то что на С++ уже неважно )) главное чтобы хоть как то работала )
Неизвестный
14.06.2011, 18:11
общий
Адресаты:
понял спасибо!

давно
Профессор
230118
3054
14.06.2011, 18:16
общий
А память надо действительно освобождать.
Неизвестный
14.06.2011, 18:43
общий
а по второй задачке получится чегонибудь? ))
Неизвестный
14.06.2011, 18:45
общий
это ответ
Здравствуйте, Polotenchikko!
Задача 1:
Код:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

// Вставка строки what в строку dst с позиции where
// Строка dst должна иметь необходимый размер для размещения результата

void insert(char* dst, const char* what, size_t where)
{
size_t lenStr = strlen(dst), lenWhat = strlen(what), // Длины строк
cnt = lenStr - where + 1; // К-во символов для переноса

char* from = dst + lenStr, *to = from + lenWhat; // Откуда и куда переносить

// Переносим часть строки. Освобождаем место для вставки
while (cnt--)
{
*to-- = *from--;
}

// Куда вставлять
to = dst + where;
// Вставка
while (*what)
{
*to++ = *what++;
}
}

int main()
{
//создаем строку и заполняем ее
char *str = malloc(100);
strcpy(str, "name Polotenchikko");

//вставляем строку
insert(str, " is", 4);

printf(""%s"\n", str);

free(str);

return 0;
}

Результат работы:
Код:
"name is Polotenchikko"


Задача 2:
Код:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

// Гласные
#define VOWELS "AEIOUY"

// Присоединяет гласные из строки src к dst
// dst должна иметь возможность вместить результирующую строку
// Возвращает количество гласных символов(требуемый размер буфера без учета '\0'
// Если src==NULL - возвращает -1
// Если dst==NULL - ничего не копирует, просто возвращает необходимый размер буфера

int addVowels(char* dst, const char* src)
{
if (!src)
{
return -1;
}
int count = strlen(dst);
if (dst)
{
dst += count;
}
// Перемещаемся по строке
while (*src)
{
// Приведение к верхнему регистру и проверка на наличие в множестве
if (strchr(VOWELS, toupper(*src)))
{
++count;
// Копируем в строку
if (dst)
{
*dst++ = *src;
}
}
++src;
}
if (dst)
{
*dst = 0;
}
return count;
}

int main()
{
char *str1 = "aggtwsbEtratrUut", str2[100] = "1234556";
addVowels(str2, str1);
printf("result:"%s"\n", str2);
return 0;
}

Результат работы:
Код:
result:"1234556aEaUu"
5
Вот это здорово! Polotenchikko в программе! )) спасибо!!!
Неизвестный
14.06.2011, 18:59
общий
Добавил 2ю задачу к ответу.
Неизвестный
14.06.2011, 19:04
общий
Спасибо большое!!!
Неизвестный
14.06.2011, 19:05
общий
а благодарности выражать только вебмани и смс? я с киви могу перести
Форма ответа