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

Тема в разделе "Общие вопросы по С и С++", создана пользователем Rendall, 11 окт 2012.

  1. Rendall

    Rendall Гость

    написал функцию, делающую что нужно, но не тем способом :

    Код (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);
    }
    не могу понять, как используя только указатели, присвоить элементу одного массива значение элемента другого массива, объясните пожалуйста.
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Код (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;
    }
     
  3. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    кто сломал подсветку кода?

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

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

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

    Rendall Гость

    Задание
    Моя реализация:
    <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);
    }
    осталось только
    как сделать пока без понятия
     
  5. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Код (Text):
    #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)
     
  6. Rendall

    Rendall Гость

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

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    по указателю записывается ноль, т.е. конец строки.

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

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

    Rendall Гость

    спасибо, разобрался.
    P.S подсветка кода не работает
     
Загрузка...
Похожие Темы - Имитация Функции Strdup
  1. nvyush
    Ответов:
    0
    Просмотров:
    1.864
  2. Генералл
    Ответов:
    2
    Просмотров:
    55
  3. rn3rjd
    Ответов:
    0
    Просмотров:
    448
  4. Sanchezz86
    Ответов:
    1
    Просмотров:
    586
  5. Sentim
    Ответов:
    1
    Просмотров:
    627

Поделиться этой страницей