Форум программистов, компьютерный форум CyberForum.ru

Копирование указателя С++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.60
Alex1991
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 34
24.04.2011, 00:48     Копирование указателя С++ #1
Есть char *mydir он указывает на второй аргумент, эсли я дописую символы с помощью strcat то соответственно инфа меняеться.
Как сделать копию изначальной char *mydir ???
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.04.2011, 00:52     Копирование указателя С++ #2
strcpy()
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.04.2011, 01:05     Копирование указателя С++ #3
Или strdup.
Но это не совсем копирование)
Alex1991
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 34
24.04.2011, 01:18  [ТС]     Копирование указателя С++ #4
Все-равно не получается ((
Может посмотрите, эта прога для копирования файлов которые находяться в текущей директории В указанную папку.
пример:
./a.out papka/
После этого файлы должны скопироваться в папку "papka"

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
 
 
using namespace std;
 
int 
my_double_ls (const char *name, char *mydir)
{
  struct dirent *d;
  DIR *dp;
    char *tmp;
    strcpy(tmp, mydir);
    
  /* Открытие каталога с проверкой ошибок */
  if ((dp = opendir (name)) == NULL)
    return (-1);
 
  /* Продолжить обход каталога,
   * выводя записи в нем, если
   * индекс остается допустимым
   */
int count1=0;
  while (d = readdir (dp))
    {
    count1++;
      if (d->d_ino != 0)
    {
      cout<<d->d_name<<endl;
      strcat(tmp, d->d_name);
      
      link(d->d_name, tmp);
      tmp=mydir;
    }
    }
 
    cout<<"Count of files: "<<count1<<endl;
 
  closedir (dp);
  return (0);
}
 
int main (int argc, char *argv[])
{
 
    my_double_ls (".",argv[1]);
 
}
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.04.2011, 01:20     Копирование указателя С++ #5
А память кто будет под временную строку выделять?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.04.2011, 01:23     Копирование указателя С++ #6
А strdup поможет не выделять. Но очищать придеться.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.04.2011, 01:24     Копирование указателя С++ #7
А ещё лучше заюзать std::string и не париться с копированием, выделением и освобождением ресурсов))
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.04.2011, 01:25     Копирование указателя С++ #8
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
int main()
{
    const char* string = "Hello";
    char * new_str = strdup(string);
    printf("%s\n", new_str);
    free(new_str);
    return 0;
}
Добавлено через 11 секунд
silent_1991, А вот тут согласен. Если С++.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.04.2011, 01:27     Копирование указателя С++ #9
Цитата Сообщение от 'ForEveR' Посмотреть сообщение
Если С++
Цитата Сообщение от 'Alex1991' Посмотреть сообщение
C++
1
#include <iostream>
как бы намекает
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.04.2011, 01:27     Копирование указателя С++ #10
silent_1991, Не смотрел код, каюсь) Но принцип действия strdup знать полезно.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.04.2011, 01:29     Копирование указателя С++ #11
ForEveR, не спорю, но тут скорее практическая задача, нежели учебная, а если и учебная, то не на строки и динамическую память, так что хочется побыстрее, покрасивее и покомпактнее)))
Alex1991
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 34
24.04.2011, 01:30  [ТС]     Копирование указателя С++ #12
Выделил так:
C++
1
char *tmp=new char[100];
Но все-равно указатель "mydir" меняется.. хотя не должен
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.04.2011, 01:33     Копирование указателя С++ #13
Показывайте весь код.
Alex1991
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 34
24.04.2011, 01:34  [ТС]     Копирование указателя С++ #14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <dirent.h>
#include <string.h>
 
 
using namespace std;
 
int 
my_double_ls (const char *name, char *mydir)
{
  struct dirent *d;
  DIR *dp;
    char *tmp=new char[100];
    strcpy(tmp, mydir);
    
  /* Открытие каталога с проверкой ошибок */
  if ((dp = opendir (name)) == NULL)
    return (-1);
 
  /* Продолжить обход каталога,
   * выводя записи в нем, если
   * индекс остается допустимым
   */
int count1=0;
  while (d = readdir (dp))
    {
    count1++;
      if (d->d_ino != 0)
    {
      cout<<d->d_name<<endl;
      strcat(tmp, d->d_name);
      cout<<"----------->"<<mydir<<endl; //для проверки
      link(d->d_name, tmp);
      tmp=mydir;
    }
    }
 
    cout<<"Count of files: "<<count1<<endl;
 
  closedir (dp);
  return (0);
}
 
int main (int argc, char *argv[])
{
 
    my_double_ls (".",argv[1]);
 
}
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.04.2011, 01:36     Копирование указателя С++ #15
C++
1
tmp=mydir;
Что это?
Alex1991
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 34
24.04.2011, 01:38  [ТС]     Копирование указателя С++ #16
Цитата Сообщение от silent_1991 Посмотреть сообщение
C++
1
tmp=mydir;
Что это?
хочу присвоить tmp первоначальное значение а именно имя директории для копирования
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
24.04.2011, 01:40     Копирование указателя С++ #17
Alex1991, этой строчкой вы делаете только одно - присваиваете указателю tmp адрес строки mydir. Немудрено, что mydir в итоге меняются, и tmp, и mydir будут указывать после этого на одну и ту же область памяти. Вам же сказали, строки копируются не так.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2011, 01:42     Копирование указателя С++
Еще ссылки по теме:

C++ Передача указателя
Удаление указателя C++
C++ Сдвиг указателя

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Alex1991
1 / 1 / 0
Регистрация: 03.12.2008
Сообщений: 34
24.04.2011, 01:42  [ТС]     Копирование указателя С++ #18
Цитата Сообщение от silent_1991 Посмотреть сообщение
Alex1991, этой строчкой вы делаете только одно - присваиваете указателю tmp адрес строки mydir. Немудрено, что mydir в итоге меняются, и tmp, и mydir будут указывать после этого на одну и ту же область памяти. Вам же сказали, строки копируются не так.
Блин.. а реально во я баран

Спасибо Большое !!! Кажись немного понял суть указателей
Yandex
Объявления
24.04.2011, 01:42     Копирование указателя С++
Ответ Создать тему
Опции темы

Текущее время: 21:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru