• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Имитация Функции Strdup

  • Автор темы Rendall
  • Дата начала
R

Rendall

Разработайте программу, функция main() которой содержит вызов предложенной стандартной функции обработки строк (по вариантам) и вызов пользовательской функции, которая имитирует действия, соответствующие выбранной стандартной функции. Обращение к элементам строки в пользовательской функции необходимо реализовать через указатели.
Тип возвращаемого функцией значения, типы аргументов должны совпадать с соответствующими параметрами стандартной функции.
написал функцию, делающую что нужно, но не тем способом :

C++:
#include "stdafx.h"
#include <string.h>
#include <iostream>
#include <clocale>
#include <malloc.h>
using namespace std;
char* my_strdup(const char*str);
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(0,"Rus");
const int MAX_STR_SIZE=257;
char *str= new char[MAX_STR_SIZE];
cout<<"Введите строку \n";
fflush(stdin);
fgets(str,MAX_STR_SIZE-1, stdin);
cout<<"\n";
char *standart_func=_strdup(str);
cout<<"Строка, скопированная с помощью функции strdup :"<<standart_func<<endl;
cout<<"Строка, скопированная с помощью функции, имитирующей strdup :";
my_strdup(str);
system("pause");
return 0;
}
char* my_strdup(const char *str)
{
int i=0;
int STR_SIZE=strlen(str);
char* copy_of_str=(char*)malloc(STR_SIZE*sizeof(char));
for(int j=0;j<STR_SIZE;j++)
{
copy_of_str[j]=str[i];
i++;
}
copy_of_str[STR_SIZE]='\0';
for(int j=0;copy_of_str[j]!='\0';j++)
cout<<copy_of_str[j];
return(copy_of_str);
}
не могу понять, как используя только указатели, присвоить элементу одного массива значение элемента другого массива, объясните пожалуйста.
 
L

lazybiz

C++:
#include <stdio.h>
#include <malloc.h>

char *my_strdup( const char *s )
{
int i, j;
char *d;
for ( i = 0; s[i]; i++ ); // считаем длину
d = malloc( i + 1 ); // выделяем память
for ( j = 0; j < i + 1; j++ ) d[j] = s[j]; // копируем вместе с нулем в конце
return d;
}

int main()
{
const char *s = "Hello";
char *d;

d = my_strdup( s );
printf( "%s\n", d );
free( d );

return 0;
}
 
R

rrrFer

кто сломал подсветку кода?

Добавлено:
как используя только указатели, присвоить элементу одного массива значение элемента другого массива, объясните пожалуйста.
C++:
T *a, *b; //2 массива
*(a+i) = *(b+j); // присваиваем i-тому элементу первого массива значение j-того элемента второго, используем адресную арифметику
вопрос понял верно?

Добавлено: почему не используете memcpy в своих dup?

Добавлено: о, подсветку починили )
 
R

Rendall

Задание
Разработайте программу, функция main() которой содержит вызов предложенной стандартной функции обработки строк (по вариантам) и вызов пользовательской функции, которая имитирует действия, соответствующие выбранной стандартной функции. Обращение к элементам строки в пользовательской функции необходимо реализовать через указатели.
Тип возвращаемого функцией значения, типы аргументов должны совпадать с соответствующими параметрами стандартной функции. Результаты работы вашей версии реализации стандартной функции и самой стандартной функции выведите в файл на диске, а из файла программно выведите на печать и сравните.
Моя реализация:
<div class="sp-wrap"><div class="sp-head-wrap"><div class="sp-head folded clickable">Code</div></div><div class="sp-body"><div class="sp-content">
C++:
#include "stdafx.h"
#include <string.h>
#include <iostream>
#include <clocale>
using namespace std;
char* my_strdup(const char*str);
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(0,"Rus");
const int MAX_STR_SIZE=257;
char *str= new char[MAX_STR_SIZE];
cout<<"Введите строку \n";
fflush(stdin);
fgets(str,MAX_STR_SIZE-1, stdin);
cout<<"\n";
char *standart_func=_strdup(str);
cout<<"Строка, скопированная с помощью стандартной функции strdup :"<<endl<<standart_func<<endl;
char *rezult=new char[strlen(str)+1];
rezult=my_strdup(str);
cout<<"Строка, скопированная с помощью функции, имитирующей strdup :"<<endl<<rezult<<endl;
FILE* stream;
errno_t err;
err = fopen_s(&stream, "Output.txt", "w+" );
if( err == 0 )
{
cout<<"Создан файл Output.txt"<<endl;
fprintf(stream, standart_func);
fprintf(stream, rezult);
fclose(stream);
}
else
printf( "Файл 'Output.txt' не был открыт\n" );
system("pause");
return 0;
}
char* my_strdup(const char *str)
{
int STR_SIZE=strlen(str)+1;
char* copy_of_str=(char*)malloc(STR_SIZE*sizeof(char));
for(int j=0;j<STR_SIZE;j++,*copy_of_str++,*str++)
{
*copy_of_str=*str;
}
for(int i=0;i<STR_SIZE;i++) 
{
*copy_of_str--;
}
return(copy_of_str);
}

осталось только
из файла программно выведите на печать и сравните
как сделать пока без понятия
 
R

rrrFer

Код:
#include <fstream>
char* my_strdup(const char *str);
int my_strlen(const char *s);

int main() {
std::ifstream ifst("input.txt");
std::ofstream ofst("output.txt");
char *str = new char[255];
char *newstr;
ifst.getline(str,255);
ifst.close();

newstr = my_strdup(str);
ofst<<newstr;
ofst.close();

delete []newstr;
delete []str;
return 0;
}

int my_strlen(const char *s) {
return !*s?0:my_strlen(++s)+1;
}
char* my_strdup(const char *str) {
int len = my_strlen(str);
char *newstr = new char[len+1];
while (*str) 
*(newstr++)=*(str++);
*newstr=0;
return newstr-len;
}
это если нельзя стандартные функции использовать, иначе не понимаю что мешает использовать memcpy или strcpy (ведь strlen ты все равно используешь, оно также из string.h)
 
R

Rendall

как работает эта функция ??
C++:
int my_strlen(const char *s) {
return !*s?0:my_strlen(++s)+1;
}
а тут что происходит с указателем?
C++:
*newstr=0;
return newstr-len;
я пока не слишком хорошо знаю синтаксис
 
R

rrrFer

по указателю записывается ноль, т.е. конец строки.

Добавлено:
как работает эта функция ??

Если строка пустая - то ее длина ноль, в противном случае длина строки на единицу больше чем у той же строки без первого символа.

Добавлено: тут подсветка кода только у меня не работает? Примите уже меры, пожалсто )
 
R

Rendall

спасибо, разобрался.
P.S подсветка кода не работает
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!