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

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

  1. Rendall

    Rendall Гость

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

    Код (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

    Репутация:
    0
    Регистрация:
    3 ноя 2010
    Сообщения:
    1.339
    Симпатии:
    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 Гость

    Репутация:
    0
    кто сломал подсветку кода?

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

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

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

    Rendall Гость

    Репутация:
    0
    Задание
    Моя реализация:
    <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 Гость

    Репутация:
    0
    Код (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 Гость

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

    rrrFer Гость

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

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

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

    Rendall Гость

    Репутация:
    0
    спасибо, разобрался.
    P.S подсветка кода не работает
     
Загрузка...

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