Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
Hrollo
34 / 34 / 6
Регистрация: 05.11.2013
Сообщений: 147
#1

Не работает strcat в QtCreator - C++

14.04.2014, 22:50. Просмотров 887. Ответов 23
Метки нет (Все метки)

Всем привет. Написал класс для работы со строками в Визуал студио(в ней перегруженный оператор + конкатенирует строки) в QtCreator оператор + нивкакую не хочет перегружаться, а точнее не объединяет строки, а просто выводит на екран неизмененную строку. Кто нибудь может подсказать что с ним сделать в Qt?
Вот код перегрузки
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
String String::operator+(const String &s)
{
    String temp;
    temp.len = len +s.len;
    temp.str = new char[temp.len+1];
    strcpy(temp.str,str);
    strcat(temp.str,s.str);
    return temp;
}
 
String String::operator+(const char *s)
{
    String temp;
    temp.len=len+strlen(s);
    temp.str = new char[temp.len+1];
    strcpy(temp.str,str);
    strcat(temp.str,s);
    return temp;
}
Добавлено через 4 минуты
И еще вопрос не по теме. Я гдето читал что ф-ции библиотеки cstring не будут поддерживаться стандарту. Это правда или нет?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2014, 22:50
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не работает strcat в QtCreator (C++):

Чтение из файла в CodeBlocks работает, а в QtCreator - нет - C++
Один и тот же компилятор (LLVM Clang): в CodeBlocks код работает, в QtCreator - нет. То же самое с MinGW. Один и тот же MinGW: в...

strcat - C++
#include <iostream> #include <conio.h> #include <cstring> using namespace std; char a, b; int main() { cout <<"\n...

strcat - C++
#include <windows.h> #include <iostream> #pragma warning (disable : 4996) void Func (char* lpszFileName); void main() {...

Функция strcat - C++
Нужно написать прогу на C++ и Ассемблере...функцмя strcat(на ассемблере сделал а вот на C++ не могу).Если кто поможет буду очень...

ошибка в strcat - C++
Пишу прогу которая будет создавать файлов сколько ты захочешь :cry: но вот она выыдеает ошибку strcat' was not declared что делать ребят? ...

Работа со strcat - C++
Не могу понять в чем проблема. char *NazFile = new char; char *Tempo = new char; char *ImyaUrl = new char; NazFile =...

23
IrineK
Заблокирован
14.04.2014, 23:53 #2
Пробуем так:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
String &String::operator+(const String &s)
{
    String temp;
    temp.len = len +s.len;
    temp.str = new char[temp.len+1];
    strcpy(temp.str,str);
    strcat(temp.str,s.str);
    return temp;
}
 
String &String::operator+(const char *s)
{
    String temp;
    temp.len=len+strlen(s);
    temp.str = new char[temp.len+1];
    strcpy(temp.str,str);
    strcat(temp.str,s);
    return temp;
}


А вообще тут как-то нехорошо с памятью.
2
Hrollo
34 / 34 / 6
Регистрация: 05.11.2013
Сообщений: 147
15.04.2014, 00:22  [ТС] #3
Спасибо я уже понял в чем проблема. Я забывал присваивать значение двух строк третьему объекту. Ваш вариант тоже реализовал)).
Нащет памяти, то конструктор по умолчанию у меня выглядит так:
C++ (Qt)
1
2
3
4
5
String::String()
{
    len = 0;
    str = NULL;
}
Поидее бессмыслено удалять нулевой указатель)
0
IrineK
Заблокирован
15.04.2014, 11:38 #4
У вас идет утечка памяти. Нужно убить старую строку str - она же непустая.
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
15.04.2014, 11:52 #5
Цитата Сообщение от IrineK Посмотреть сообщение
Пробуем так:
Вообще-то это UB. Ссылка на локальный объект.

Добавлено через 8 минут
Цитата Сообщение от Hrollo Посмотреть сообщение
Я гдето читал что ф-ции библиотеки cstring не будут поддерживаться стандарту.
Нет, не правда. Если бы кто-то предложил такое, его бы сразу сочли сумасшедшим. Ибо это означало бы, что миллионы строк кода в новом компиляторе перестали бы собираться. Это совершенно не в духе С++, отказываться от обратной совместимости. Даже безполезные нынче триграфы убрали из стандарта только совсем недавно, хотя не применяются они наверное уже около двух десятков лет.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
15.04.2014, 13:15 #6
DrOffset, когда это успели триграфы убрать из стандарта? В C++11 есть, а 14 еще не утвердили.
1
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
15.04.2014, 13:41 #7
Цитата Сообщение от Tulosba Посмотреть сообщение
DrOffset, когда это успели триграфы убрать из стандарта? В C++11 есть, а 14 еще не утвердили.
И то правда. Перепутал с другой вещью:
Убрали ее в GCC из списка поддерживаемых фич по умолчанию, теперь нужно специально их включать опцией -trigraphs.
Hrollo, видишь, даже триграфы не убрали, так что про cstring - это вообще нонсенс
0
IrineK
Заблокирован
15.04.2014, 13:53 #8
Hrollo,
у вас temp делает не то, что нужно.


Кликните здесь для просмотра всего текста
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
#include <iostream>
 
class String
{
public:
    String (): len(0), str(NULL) {}
    String ( char *_str, int _len) : len (_len)
    {   str = new char [len + 1];
        strncpy (str, _str, _len+1);
    }
 
    String (const String &s) : len (s.len)
    {   str = new char [len + 1];
        strncpy (str, s.str, s.len+1);
    }
 
    ~String ()
    {   delete [] str;
    }
 
 
    String &operator = (const String &s)
    {   if (str == s.str && len == s.len) 
        return *this;
     
        if (str != NULL)
        {   delete [] str;
            str = NULL;
        }
        len = s.len;
        str = new char [len + 1];
        strncpy (str, s.str, s.len+1);
        return *this;
    }
 
    String &operator += (const String &s);
    String &operator += (const char *s);
 
    friend std::ostream &operator <<(std::ostream & os, const String &s);
 
private:
    int len;
    char *str;
};
 
String &String :: operator += (const String &s)
{   String temp (*this);
    
    if (str != NULL)
    {   delete [] str;
        str = NULL;
    }
 
    len = temp.len + s.len;
    str = new char [len + 1];
    strncpy (str, temp.str, temp.len+1);
    strncat (str, s.str, s.len+1);
    return *this;
}
 
std::ostream &operator <<(std::ostream & os, const String &s)
{   os << s.str;
    return os;
}
 
 
int main()
{   String s1 ("12345", 5);
    String s2 ("999", 3);
    std :: cout << s1 << " " << s2 << '\n';
    s1 += s2;
    std :: cout << s1 << '\n';
 
    s2 = s1;
    std :: cout << s2 << '\n';
 
    s2 += s1;
    std :: cout << s2 << '\n';
 
    std::cin.get();
    return 0;
}
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
15.04.2014, 14:15 #9
IrineK, Он вроде operator+ реализует, а не +=.
В его реализации и в вашей одна и та же проблема. Которая, впрочем, не относится к теме. Но тем не менее:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    String & operator += (const String &s)
    {   String temp (*this);
 
        if (str != NULL)
        {   delete [] str;
            str = NULL;
        }
 
        len = temp.len + s.len;
        str = new char [len + 1];
        strncpy (str, temp.str, temp.len+1); // <------- проблема, если temp.str - NULL
        strncat (str, s.str, s.len+1);
        return *this;
    }
Вот в таком коде:
C++
1
2
3
4
5
6
7
int main()
{
    String a;
    String b("test", 4);
 
    a += b;
}
1
IrineK
Заблокирован
15.04.2014, 14:29 #10
Цитата Сообщение от DrOffset Посмотреть сообщение
Он вроде operator+ реализует, а не +=.
В данном контексте - именно += (так органичней - хотя, дело вкуса).

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот в таком коде:
Сейчас допилим.

Добавлено через 3 минуты
Кликните здесь для просмотра всего текста
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
#include <iostream>
 
class String
{
public:
    String (): len(0), str(NULL) {}
    String (const char *_str, int _len) : len (_len)
    {   str = new char [len + 1];
        strncpy (str, _str, _len+1);
    }
 
    String (const String &s) : len (s.len)
    {   str = new char [len + 1];
        strncpy (str, s.str, s.len+1);
    }
 
    ~String ()
    {   delete [] str;
    }
 
    String &operator = (const String &s)
    {   if (str == s.str && len == s.len) 
        return *this;
     
        if (str != NULL)
        {   delete [] str;
            str = NULL;
        }
        len = s.len;
        str = new char [len + 1];
        strncpy (str, s.str, s.len+1);
        return *this;
    }
 
    String &operator += (const String &s);
    String &operator += (const char *s);
 
    friend std::ostream &operator <<(std::ostream & os, const String &s);
 
private:
    int len;
    char *str;
};
 
String &String :: operator += (const String &s)
{   if (str == NULL)
    {   *this = s;
        return *this;
    }
 
    String temp (*this);
    delete [] str;
    str = NULL;
 
    len = temp.len + s.len;
    str = new char [len + 1];
    strncpy (str, temp.str, temp.len+1);
    strncat (str, s.str, s.len+1);
    return *this;
}
 
std::ostream &operator <<(std::ostream & os, const String &s)
{   os << s.str;
    return os;
}
 
 
int main()
{   String s1 ("12345", 5);
    String s2 ("999", 3);
    std :: cout << s1 << " " << s2 << '\n';
    s1 += s2;
    std :: cout << s1 << '\n';
 
    s2 = s1;
    std :: cout << s2 << '\n';
 
    s2 += s1;
    std :: cout << s2 << '\n';
 
    String a;
    String b("test", 4);
 
    a += b;
    std :: cout << a << '\n';
 
    std::cin.get();
    return 0;
}


Добавлено через 7 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
одна и та же проблема
Еще проблемы?
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
15.04.2014, 14:42 #11
Цитата Сообщение от IrineK Посмотреть сообщение
В данном контексте - именно += (так органичней - хотя, дело вкуса).
Я исхожу из того, что спрашивает автор Он же как бы "Заказчик" в этой ситуации. А если уж говорить об органичности, то у нормального класса String должны быть все операторы, и + и +=. Хотя бы потому, что решают немного разные задачи.

Лично мне кажется, что темповый объект здесь лишний. Т.к. он конструируется через копирование, следовательно еще раз вызывается new, хотя оно не нужно по большому счету.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    String & operator+=(const String & s)
    {
        if(s.str != NULL)
        {
            char * buf = new char[len + s.len + 1];
            if(str != NULL)
            {
                strncpy(buf, str, len + 1);
            }
            strncat(buf, s.str, s.len + 1);
            len += s.len;
            delete [] str;
            str = buf;
        }
        return *this;
    }
Добавлено через 5 минут
Собственно strncat тут тоже не особо нужен, потому что у нас и так есть конец строки, куда надо дописывать (strncat же его еще сначала должен найти).
Вместо 10й строки можно просто написать так:
C++
1
            strncpy(buf + len, s.str, s.len + 1);
0
IrineK
Заблокирован
15.04.2014, 14:43 #12
А теперь проверьте на собственный тест )
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
15.04.2014, 14:46 #13
Цитата Сообщение от IrineK Посмотреть сообщение
А теперь проверьте на собственный тест )
Это к чему?
0
IrineK
Заблокирован
15.04.2014, 14:54 #14
У вас проблема, если str == NULL
0
DrOffset
7376 / 4453 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
15.04.2014, 14:59 #15
Цитата Сообщение от IrineK Посмотреть сообщение
У вас проблема, если str == NULL
Где же? Если s.str == NULL мы не войдем вообще в условие, будем считать, что к строке ничего не добавилось.
Если s.str != NULL, но str == NULL, то мы не войдем во второе условие и началом строки будет содержимое из s.str.
Проблемы нет, или поясните что имеется в виду тогда
0
15.04.2014, 14:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2014, 14:59
Привет! Вот еще темы с ответами:

функция strcat - C++
Помогите разобраться, пожалуйста. char* resultat = 0; char* str = &quot;abc&quot;; strcat(resultat, str); вылетает с ошибкой. Как нужно...

Работа функции strcat() - C++
int main() { char* str = new char; strcat(str, &quot;stroka1&quot;); strcat(str, &quot;stroka2&quot;); printf(str); deletestr; } ...

Strcat или strcpy_s - C++
strcat(name, &quot; &quot;); strcat(lastname, &quot; &quot;); strcpy(name, (strcat(strcat(lastname, name), dlastname))); strcpy(nomergroup, strcat(v,...

Как применить strcat? - C++
char* strcat(char *s1, const char *s2) зачем нужны * перед strcat, s1 и s2? И как можно эту функцию применить?


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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