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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Nickolay0512
57 / 39 / 19
Регистрация: 26.09.2013
Сообщений: 317
Записей в блоге: 1
#1

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

25.07.2014, 12:22. Просмотров 562. Ответов 7
Метки нет (Все метки)

Есть программа, которая делает конкатенацию строк.
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     Конкатенация строк: Зачем строки создаются в динамической памяти?
Посмотрите здесь:

Динамические массивы создаются в динамической области памяти с использованием операций NEW и DELETE - C++
Срочно нужна помощь! Массивы создаются в динамической области памяти с использованием операций NEW и DELETE. Задано два массива А (5) и...

Функция получает массив указателей на строки и возвращает строку в динамической памяти, содержащую объединенный текст из входных строк - C++
Функция получает массив указателей на строки и возвращает строку в динамической памяти, содержащую объединенный текст из входных строк.

Сравнение двух строк с выделением динамической памяти - C++ - C++
Подскажите почему не работает код? Ввожу две разные строки и всегда выводит equal. Уже как только не крутил. Подскажите пожалуйтста, что...

Строки с выделением динамической памяти - C++
Привет всем! Помогите решить вот такую задачу: Ввести две строки. Определить совпадение их слов (Первое слово 1 строки сравнить с первым...

Ошибка динамической памяти на примере переворота строки - C++
Подскажите, пожалуйста, почему при одном и том же алгоритме, переворот строки не работает если использовать динамическое выделение памяти ...

Выделение и удаление памяти, выделенной для динамической строки - C++
Данная функция производит ввод и собственно контроль ввода (размер массива от 1 до 20, иначе должна выдавать ошибку; при вводе букв также...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6322 / 5906 / 1913
Регистрация: 18.12.2011
Сообщений: 15,189
Завершенные тесты: 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
Сообщений: 317
Записей в блоге: 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
Сообщений: 317
Записей в блоге: 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     Конкатенация строк: Зачем строки создаются в динамической памяти?
Еще ссылки по теме:

Функции потока: Если строки хранят числа, то выводится сумма, иначе – конкатенация строк - C++
Л.Р.2 Вариант №5 ------------ Разработать программу, осуществляющую ввод двух строк, введенных пользователем. Далее, если обе...

Если обе строки хранят целые числа, то выводится сумма чисел, в противном случае – конкатенация строк - C++
Т.к я в этом деле вообще новичок, прошу знающих людей пожалуйста помочь мне... Л.Р.1 Вариант №5 ------------ Разработать две...

Вычислить сумму элементов каждой нечетной строки матрицы (с использованием классов и динамической памяти) - C++
Ввести матрицу А(m,n) m&lt;&gt;n. Вычислить сумму элементов каждой нечетной строки матрицы. вывести с пояснением полученные значения сумм и...

Конкатенация двух строк - C++
Как написать программу, которая задает пользователю какие-то вопрос, которые требует однозначного ответа. Проверить его правильность. Дать...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru