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

Скопировать один элемент в другой в рамках такого массива - C++

Восстановить пароль Регистрация
 
 
Ko4evnik
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 11
25.08.2013, 01:16     Скопировать один элемент в другой в рамках такого массива #1
скажите, плиз, кто-нибудь, как перекочевать, то бишь, скопировать один элемент в другой в рамках такого массива?
C++
1
char *name[COUNT][NAME];
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.08.2013, 01:16     Скопировать один элемент в другой в рамках такого массива
Посмотрите здесь:

Как скопировать символ из символьного массива в другой массив C++
C++ STL, Queue (в очереди изменить один элемент на другой?)
Скопировать из одного символьного массива в другой, начиная с определенной позиции C++
C++ Если елементы массива соседние одинаковы то один из них заменяется на 0 а другой увеличиваетмя на один
Скопировать один файл в другой C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
25.08.2013, 01:21
  #2

Не по теме:

Цитата Сообщение от Ko4evnik Посмотреть сообщение
эбаут поинтс, вот хев ай ду!
это надо сохранить пока не переименовали тему

IGPIGP
25.08.2013, 01:46
  #3

Не по теме:

Цитата Сообщение от Jupiter Посмотреть сообщение
это надо сохранить пока не переименовали тему
Ноу бады ноуз, вот хэз би дан, тунайт...
Ол лив ин фэйл зис сэд анд лонли найт!

Ko4evnik
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 11
25.08.2013, 01:52  [ТС]     Скопировать один элемент в другой в рамках такого массива #4
Цитата Сообщение от IGPIGP Посмотреть сообщение

Не по теме:


Ноу бады ноуз, вот хэз би дан, тунайт...
Ол лив ин фэйл зис сэд анд лонли найт!

донт край, мэн, зэрэ вил би окэй туморроу
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6166 / 2895 / 282
Регистрация: 04.12.2011
Сообщений: 7,697
Записей в блоге: 3
25.08.2013, 02:28     Скопировать один элемент в другой в рамках такого массива #5
Цитата Сообщение от Ko4evnik Посмотреть сообщение
донт край, мэн, зэрэ вил би окэй туморроу
Ай ду белив ю вил.
Куда ж Вы денетесь.

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
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
char *what_has_be_done[ ][3]={
    {"No",   "body","knows,"},
    {"what", "has", "be"}, 
    {"done", "to",  "night..."}
};
 
int main()
{
    SetConsoleCP (1251); SetConsoleOutputCP (1251);
char **let_it_be_done[3];
int sz;
    for(int i=0; i<3; ++i){
let_it_be_done[i] = new char*[3];//
for(int j=0; j<3; ++j){
sz=strlen(what_has_be_done[i][j]);
let_it_be_done[i][j] = new char[sz+1];//
}
cout<<endl;
    }
 
for(int i=0; i<3; ++i){
for(int j=0; j<3; ++j){
strcpy(let_it_be_done[i][j], what_has_be_done[i][j]);
cout<<let_it_be_done[i][j]<<" ";
}
cout<<endl;
}
cout<<"Фор ту континьить плиз,\nпрэсс э кей brave knight..."<<endl; 
cin.get();
    return 0;
}
Ko4evnik
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 11
25.08.2013, 21:38  [ТС]     Скопировать один элемент в другой в рамках такого массива #6
Грейт! Фенк ю вери матч!
Ай хоуп айл кэн дан май таск тунайт
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6166 / 2895 / 282
Регистрация: 04.12.2011
Сообщений: 7,697
Записей в блоге: 3
25.08.2013, 21:58     Скопировать один элемент в другой в рамках такого массива #7
Цитата Сообщение от Ko4evnik Посмотреть сообщение
Грейт! Фенк ю вери матч!
Ай хоуп айл кэн дан май таск тунайт
Ю ар вэлкам.
Бивэйр оф чар эррэйз виз ту димэншенз,
Ху ноуз эбаут, вотил хэппэнд, бат донт мэншон...
Ай шюр, ол хэз бин биинг вэл туморроу,
Лэт фар эвэй фром ю би эни сорроу.
Гуд лак!
Ko4evnik
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 11
27.08.2013, 01:14  [ТС]     Скопировать один элемент в другой в рамках такого массива #8
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ю ар вэлкам.
Бивэйр оф чар эррэйз виз ту димэншенз,
Ху ноуз эбаут, вотил хэппэнд, бат донт мэншон...
Ай шюр, ол хэз бин биинг вэл туморроу,
Лэт фар эвэй фром ю би эни сорроу.
Гуд лак!
так я понимаю, что мне и не нужен такого вида массив
C++
1
char *name[COUNT][NAME];
мне сразу надо брать
C++
1
char **name[COUNT];
и с ним уже оперировать? так же проще, я правильно понял?
san92der
14 / 14 / 3
Регистрация: 27.10.2012
Сообщений: 108
27.08.2013, 01:30     Скопировать один элемент в другой в рамках такого массива #9
В этих двух строчках написано одно и тоже. Просто во второй надо будет дополнительно выделять и освобождать память, когда в первой записи ты уже выделил для неё [NAME] элементов.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6166 / 2895 / 282
Регистрация: 04.12.2011
Сообщений: 7,697
Записей в блоге: 3
27.08.2013, 02:07     Скопировать один элемент в другой в рамках такого массива #10
Вот как это можно сделать с динамическим массивом:
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
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
char *what_has_be_done[ ][3]={
    {"No",   "body","knows,"},
    {"what", "has", "be"}, 
    {"done", "to",  "night..."}
};
 
int main()
{
    SetConsoleCP (1251); SetConsoleOutputCP (1251);
char **let_it_be_done[3];
int sz;
    for(int i=0; i<3; ++i){
let_it_be_done[i] = new char*[3];//
for(int j=0; j<3; ++j){
sz=strlen(what_has_be_done[i][j]);
let_it_be_done[i][j] = new char[sz+1];//
}
cout<<endl;
    }
 
for(int i=0; i<3; ++i){
for(int j=0; j<3; ++j){
strcpy(let_it_be_done[i][j], what_has_be_done[i][j]);
cout<<let_it_be_done[i][j]<<" ";
}
}
cout<<endl;
//теперь поменяем значение в последнем элементе со строки "night..." на строку "knight..."
//строка источник длинее строки назначения и значит нужно освободить память от строки 9 симолов
//выделить тамже место под 10 и скопировать туда "knight..."
delete let_it_be_done[2][2];
char *newStr = "knight...";
sz=strlen(newStr);//9
let_it_be_done[2][2] = new char[sz+1];
strcpy(let_it_be_done[2][2],newStr);
//готово, теперб выводим...
for(int i=0; i<3; ++i){
for(int j=0; j<3; ++j){
cout<<let_it_be_done[i][j]<<" ";
}
}
cout<<endl;
cout<<"Фор ту континьить плиз,\nпрэсс э кей brave knight..."<<endl; 
cin.get();
    return 0;
}
Тут видно как перевыделить память и записать новую строку.
Ko4evnik
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 11
28.08.2013, 18:13  [ТС]     Скопировать один элемент в другой в рамках такого массива #11
Но неужели нет более простого способа, не прибегая к дополнительным массивам, скопировать [i+1] запись в [i] запись?
ну типа как в обычном массиве
C++
1
2
3
char name[i][j];
 
strcpy(name[i],name[i+1]);
???
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6166 / 2895 / 282
Регистрация: 04.12.2011
Сообщений: 7,697
Записей в блоге: 3
28.08.2013, 18:27     Скопировать один элемент в другой в рамках такого массива #12
Цитата Сообщение от Ko4evnik Посмотреть сообщение
Но неужели нет более простого способа, не прибегая к дополнительным массивам, скопировать [i+1] запись в [i] запись?
ну типа как в обычном массиве
Что-то небыстро дело движется. Чувствуется основательность.
Если длина строк совпадает, то в динамическом массиве можно. Если массив const char, то только долото и молоток помогут. Не пораньтесь.
Ko4evnik
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 11
28.08.2013, 19:04  [ТС]     Скопировать один элемент в другой в рамках такого массива #13
А значит, нужно выделять новую память для [n] элемента в размере памяти [n+1] элемента каждый раз?

C++
1
2
3
4
5
6
7
8
char **let_it_be_done[3];
int sz;
    for(int i=0; i<3; ++i){
let_it_be_done[i] = new char*[3];
for(int j=0; j<3; ++j){
sz=strlen(what_has_be_done[i][j]);
[B]let_it_be_done[i][j] = new char[sz+1];[/B]//
}
а в случае, если я хочу сделать массив строк (1 столбец), пока что статический
C++
1
char *name[COUNT][1];
то мне стоит сделать так?
C++
1
2
3
sz = strlen(what_has_be_done[1][0]);
    what_has_be_done[0][0] = new char[sz+1];
    strcpy(what_has_be_done[0][0], what_has_be_done[1][0]);
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6166 / 2895 / 282
Регистрация: 04.12.2011
Сообщений: 7,697
Записей в блоге: 3
28.08.2013, 19:28     Скопировать один элемент в другой в рамках такого массива #14
Цитата Сообщение от Ko4evnik Посмотреть сообщение
а в случае, если я хочу сделать массив строк (1 столбец), пока что статический
Это загадочное заявление. Как и весь вопрос. "А если" тут пример совершенно неверного планирования. Давайте Вы полностью приведёте условие Вашей задачи и код который удалось написать. Предварительно можно почитать о строках в стиле Си. При выделении памяти на стеке перевыделить её не получится. Что касается отличия строки как массива и массива строк как таковых, то они не являются типами детерминированной длины. В этом смысле копирование их элементов отличается от копирования элементов в массивах вроде int Arr[].
Расскажите задачу или вопрос будет висеть долго. Have fun!
Ko4evnik
0 / 0 / 0
Регистрация: 23.08.2013
Сообщений: 11
28.08.2013, 19:42  [ТС]     Скопировать один элемент в другой в рамках такого массива #15
Ок. Итак, заполняется таблица. Но поскольку я застрял, она состоит из одного столбца и определенного количества строк [COUNT]. При помощи switch-case выбирается пункт из меню. Одним из этих пунктов является удаление ненужного нам поля и сдвиг всех нижестоящих элементов вверх.

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include "stdafx.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"
#include "windows.h"
#include <iostream>
 
using namespace std;
 
void vvod(void);
void deleterec();
void show();
 
#define NAME 1
#define COUNT 3
 
char *name[COUNT][NAME];
 
 
int main()
{
    system("cls");
    char ch='0';
 
    printf("1. Enter record\n");
 
    printf("3. Delite\n");
 
    printf("Select from the menu: \n");
    
    while ((ch!='1') && (ch!='2') && (ch!='3') && (ch!='4') && (ch!='5'))
    {ch = getchar();
 
        switch(ch)
        {
            case '1':
                vvod();
            case '2':
                edit();
            case '3':
                deleterec();
            case '4':
                exit(0);
            case '5':
                fuckmeiamfamous();
        }
    }
 
    return 0;
}
 
void vvod(void)
{
    system("cls");
 
    for (int i=0;i<COUNT;i++)
    {
        printf("Input %d name:\n",i);
        //scanf("%s",list[i]);
        scanf("%s",name[i]);
        if(!name[i]) break;
    }
 
    main();
}
 
void deleterec()
{
    system("cls");
    show();
 
    int n;
    char ch;
    
    printf("Which record would you want to delete?\n");
    scanf("%d",&n);
    
    printf("Are you sure? y/n\n");
    
    do
    {
        ch=getchar();
    } while ((ch != 'y' && ch != 'n'));
 
    if(ch=='y')
    {
        for(int i=n-1;i<COUNT;++i)
        {
//Здесь-то и начинается вся заварушка
//          int sz;
 
//          sz = strlen(name[1][0]);
//          name[0][0] = new char[sz+1];
//          strcpy(name[0][0], name[1][0]);
        }
 
        printf("Successfull delete...\n");
 
        getch();
        main();
    }
    
    if (ch=='n') main();
}
 
void show(void)
{
    for(int i=0;i<COUNT;i++)
    {
        //printf("%d: %s\n", i+1, list[i]);
        printf("%d: %s\n", i+1, name[i]);
    }
}
Так вот, это удаление я и пытаюсь реализовать копированием всех элементов на [n-1] позицию.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6166 / 2895 / 282
Регистрация: 04.12.2011
Сообщений: 7,697
Записей в блоге: 3
28.08.2013, 20:09     Скопировать один элемент в другой в рамках такого массива #16
Цитата Сообщение от Ko4evnik Посмотреть сообщение
Итак, заполняется таблица.
Зачем? Задано ли количество строк?
Дело в том, что для инициализации двумерного массива, нужно сначала инициализировать одномерный массив. Это массив указателей, которые будут указывать на массивы. В С++ 2-х мерный массив это массив массивов. И тут важно даже не то, что изменять размер первого массива нельзя, (легче создать новый двухмерный), а то что Вы не создали даже такой массив, и пытаетесь инициализировать массив строк name[0][0] = new char[sz+1];
когда массива указателей вроде указателя name[0] = new char*[some_const_int] у Вас нет. А должен быть целый массив таких. Смотрите пример. Там всё есть, но без литературы тут не обойтись. Или почитайте или упростите себе задачу. Но сначала бы понять в чём она состоит. Просто "создаётся таблица" не подходит. Попробуйте сказать, что хотите сделать. Ещё невредно нарисовать как выглядит одномерный массив char*.
Но главное, похоже, у Вас трудности с пониманием как выделить память под массив даже int. Как одномерный так и двухмерный. Советую позаниматься этим. К char* приступайте только когда тема указателей и массивов на int будет от зубов отскакивать.
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
28.08.2013, 20:14     Скопировать один элемент в другой в рамках такого массива #17
Цитата Сообщение от Ko4evnik Посмотреть сообщение
Одним из этих пунктов является удаление ненужного нам поля и сдвиг всех нижестоящих элементов вверх.
я бы записал на место удаленной строки пустую строку и не мучался
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6166 / 2895 / 282
Регистрация: 04.12.2011
Сообщений: 7,697
Записей в блоге: 3
28.08.2013, 21:00     Скопировать один элемент в другой в рамках такого массива #18
Цитата Сообщение от ValeryS Посмотреть сообщение
я бы записал на место удаленной строки пустую строку и не мучался
Хорошо, что Вы понимаете, что нужно сделать. Мне и правду непонятно.
Нужно ли поведение прямоугольного массива или нужен как раз зубчатый? В чём задача? Зачем смешаны библиотеки ввода-вывода. Может вектор векторов строк string самое то? Непонятно.
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
28.08.2013, 21:19     Скопировать один элемент в другой в рамках такого массива #19
Цитата Сообщение от IGPIGP Посмотреть сообщение
Хорошо, что Вы понимаете, что нужно сделать. Мне и правду непонятно.
мне тоже не понятно что нужно ТС
я говорю как бы я сделал
например есть строка
C++
1
char str[]="Мама"
которая в памяти будет лежать как
C++
1
char str[]={'М', 'а','м','а', 0}
ну можно так написать
C++
1
char str[]={'М', 'а','м','а',\0}
теперь мне нужно удалить строку
в первый (нулевой) элемент массива записываем 0(конец строки)
C++
1
char str[]={0, 'а','м','а', 0}
и все у нас пустая строка
которая ничего не делает( даже на экран не выводится)
но это если только удаление а если вставка то без динамического распределения памяти не обойтись
тогда бы я наплевал на массив и работал бы со списком
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.08.2013, 21:38     Скопировать один элемент в другой в рамках такого массива
Еще ссылки по теме:

C++ Скопировать два двумерных массива в один одномерный
Скопировать один динамический массив в другой C++

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

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6166 / 2895 / 282
Регистрация: 04.12.2011
Сообщений: 7,697
Записей в блоге: 3
28.08.2013, 21:38     Скопировать один элемент в другой в рамках такого массива #20
ValeryS, да можно и так.
Если знать максимальный возможный размер например 100 то можно:
char buf[100]
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
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
int main()
{
    SetConsoleCP (1251); SetConsoleOutputCP (1251);
typedef char Buff[100];
 
Buff ch_matrix[3][4];
for(int i=0; i<3; ++i)
for(int j=0; j<4; ++j)strcpy(ch_matrix[i][j],"mama");
 
for(int i=0; i<3; ++i){
for(int j=0; j<4; ++j)cout<<ch_matrix[i][j]<<" ";
cout<<endl;
}
cout<<"-------------------"<<endl;
strcpy(ch_matrix[0][0],"dusya");
strcpy(ch_matrix[1][1],"busya");
strcpy(ch_matrix[2][3],"papa");
 
for(int i=0; i<3; ++i){
for(int j=0; j<4; ++j)cout<<ch_matrix[i][j]<<" ";
cout<<endl;
}
 
cin.get();
    return 0;
}
Yandex
Объявления
28.08.2013, 21:38     Скопировать один элемент в другой в рамках такого массива
Ответ Создать тему
Опции темы

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