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

Конкатенация строк: Зачем строки создаются в динамической памяти? - C++

Восстановить пароль Регистрация
 
Nickolay0512
57 / 39 / 19
Регистрация: 26.09.2013
Сообщений: 318
Записей в блоге: 1
25.07.2014, 12:22     Конкатенация строк: Зачем строки создаются в динамической памяти? #1
Есть программа, которая делает конкатенацию строк.
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
#include <iostream>
using namespace std;
char* Concatenate(char* string1, char* string2)
{
    int lengthString1 = GetLength(string1);
    int lengthString2 = GetLength(string2);
    int lengthString3 = lengthString1 + lengthString2;
    int charString1 = 0;
    int charString2 = 0;
    char* string3 = new char[lengthString3];
    while (string1[charString1])
    {
        string3[charString1] = string1[charString1];
        charString1++;
    }
    while (string2[charString2])
    {
        string3[charString1] = string2[charString2];
        charString1++;
        charString2++;
    }
    string3[lengthString3] = ('\0');
    return string3;
}
int main()
{
        const int a = 1000;
        char *string1 = new char[a];
        char *string2 = new char[a];
    cout << "Enter first string" << endl;
    gets(string1);
    gets(string1);
    cout << "Enter second string" << endl;
    gets(string2);
    cout << "Result:=  " << Concatenate(string1, string2) << endl;
    delete[] string1;
    delete[] string2;
}
Программа работает. Вопрос в том, что за условие в цикле while (string1[charString1])? Зачем строки создаются в динамической памяти? И можно ли написать функцию покороче(менять заголовок функции нельзя)?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.07.2014, 12:22     Конкатенация строк: Зачем строки создаются в динамической памяти?
Посмотрите здесь:

C++ Строки с выделением динамической памяти
выделение и удаление памяти, выделенной для динамической строки C++
Если обе строки хранят целые числа, то выводится сумма чисел, в противном случае – конкатенация строк C++
C++ Функции потока: Если строки хранят числа, то выводится сумма, иначе – конкатенация строк
Функция получает массив указателей на строки и возвращает строку в динамической памяти, содержащую объединенный текст из входных строк C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5955 / 5560 / 1788
Регистрация: 18.12.2011
Сообщений: 14,209
Завершенные тесты: 1
25.07.2014, 12:35     Конкатенация строк: Зачем строки создаются в динамической памяти? #2
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
#include <cstring>
char* Concatenate(char* string1, char* string2)
{
    int lengthString1 = GetLength(string1);
    int lengthString2 = GetLength(string2);
    int lengthString3 = lengthString1 + lengthString2;
    char* string3 = new char[lengthString3+1];
// если можно пользоваться стандартными функциями, то 2 следующие строки заменят все, что закомментировано
    strcpy(string3,string1);
    strcat(string3,string2);
/*
    
    while (string1[charString1])// по очереди копируем символы 1-ой строки
    {
        string3[charString1] = string1[charString1];
        charString1++;
    }
    while (string2[charString2])// по очереди копируем символы 2-ой строки в хвост 1-ой
    {
        string3[charString1] = string2[charString2];
        charString1++;
        charString2++;
    }
    string3[lengthString3] = ('\0');// строка должна заканчиваться нулем
*/
    return string3;
}
int main()
{
        const int a = 1000;
        char string1[a];
        char string2[a];
    cout << "Enter first string" << endl;
    gets(string1);
    cout << "Enter second string" << endl;
    gets(string2);
    char* str3=Concatenate(string1, string2); // str3 создана динамически, ее терять нельзя
    cout << "Result:=  " << str3 << endl;
    delete[] str3; // удаляем только str3
    return 0;
 }
f0rtung
2 / 2 / 2
Регистрация: 24.07.2014
Сообщений: 9
25.07.2014, 12:36     Конкатенация строк: Зачем строки создаются в динамической памяти? #3
Программа просто склеивает строки. Условие в цикле является true, пока не дойдет до конца строки и не упрется в "\0", затем начинается второй цикл по такому же принципу. Почему в динамической - возможно это пример работы с дин.памятью ? Написать покороче можно, можно даже стандартной функцией воспользоваться - strcpy.
Nickolay0512
57 / 39 / 19
Регистрация: 26.09.2013
Сообщений: 318
Записей в блоге: 1
25.07.2014, 12:47  [ТС]     Конкатенация строк: Зачем строки создаются в динамической памяти? #4
Стандартные функции использовать нельзя.
Пытался написать функцию покороче, но после ввода строк вылетает ошибка "нарушение прав доступа при записи".
Вот моя программа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
char* Concatenate(char* string1, char* string2)
{
    char* string;
    int i,j;
    for (i=0; string1[i]!='\0'; i++)
        string[i]=string1[i];
    for (j=0; string2[j]!='\0'; j++,i++)
        string[i]=string2[j];
    string[i]='\0';
    return string;
}
int main()
{
        char string1[a];
    char string2[a];
    cout << "Enter first string" << endl;
    cin >> string1;
    cout << "Enter second string" << endl;
    cin >> string2;
    cout << "Result:=  " << Concatenate(string1, string2) << endl;
}
Подскажите что тут не так
f0rtung
2 / 2 / 2
Регистрация: 24.07.2014
Сообщений: 9
25.07.2014, 13:01     Конкатенация строк: Зачем строки создаются в динамической памяти? #5
Объявите переменную a в main, у меня после этого все скомпилировалось и заработало.
Nickolay0512
57 / 39 / 19
Регистрация: 26.09.2013
Сообщений: 318
Записей в блоге: 1
25.07.2014, 13:04  [ТС]     Конкатенация строк: Зачем строки создаются в динамической памяти? #6
f0rtung, Вы какой средой пользуетесь? У меня в visual studio ошибка(
f0rtung
2 / 2 / 2
Регистрация: 24.07.2014
Сообщений: 9
25.07.2014, 13:15     Конкатенация строк: Зачем строки создаются в динамической памяти? #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
у меня в Geany работает, в Qt не выводится результирующая строка. Проблема в том. что у вас указатель char* string в функции склеивания ни на что не ссылается.
Попробуйте вот такой вариант:
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
#include <iostream>
#include <cstring>
using namespace std;
char* Concatenate(char* string1, char* string2)
{
    char* string = new char[strlen(string1) + strlen(string2)];
    int i,j;
    for (i=0; string1[i]!='\0'; i++)
        string[i]=string1[i];
    for (j=0; string2[j]!='\0'; j++,i++)
        string[i]=string2[j];
    string[i]='\0';
    return string;
}
int main()
{
    int a = 3;
    char string1[a];
    char string2[a];
    cout << "Enter first string" << endl;
    cin >> string1;
    cout << "Enter second string" << endl;
    cin >> string2;
    cout << "Result:=  " << Concatenate(string1, string2) << endl;
    return 0;
}
если нельзя использовать встроенную функцию вывода длины строки, ее можно тоже самому написать, или цикл сделать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2014, 13:22     Конкатенация строк: Зачем строки создаются в динамической памяти?
Еще ссылки по теме:

Динамические массивы создаются в динамической области памяти с использованием операций NEW и DELETE C++
Вычислить сумму элементов каждой нечетной строки матрицы (с использованием классов и динамической памяти) C++
Ошибка динамической памяти на примере переворота строки C++

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

Или воспользуйтесь поиском по форуму:
Nickolay0512
57 / 39 / 19
Регистрация: 26.09.2013
Сообщений: 318
Записей в блоге: 1
25.07.2014, 13:22  [ТС]     Конкатенация строк: Зачем строки создаются в динамической памяти? #8
f0rtung, теперь работает. Большое спасибо)
Yandex
Объявления
25.07.2014, 13:22     Конкатенация строк: Зачем строки создаются в динамической памяти?
Ответ Создать тему
Опции темы

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