Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/34: Рейтинг темы: голосов - 34, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 04.02.2015
Сообщений: 22
1

Непонятные символы в консоли

16.02.2015, 19:09. Показов 6258. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток! Работаю со строками, перезагружаю операторы, но на консоль вместе с результатом выводятся какие-то непонятные символы!
Помогите пожалуйста!
Вот код:

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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include <string.h>
#include <iostream>
 
using namespace std;
 
class nik //объявление класса
{
    char *new_string=NULL; //массив указателей
    int string_size=0;
public:
    nik(int sting_len) //конструктор, параметр - размер строки
        {
            string_size = sting_len;
            new_string= new char [string_size]; //массив указателей на строки, размером size
            new_string = NULL;
    }
 
        ~nik() //деструктор
        {
            if(new_string)
            {
               delete [] new_string;
                new_string=NULL;
                string_size=0;
            }
        }
// Методы
 
    int operator = (nik); //прототип метода, в котором перегружается =
 
    char* operator + (char); //прототип метода, в котором перегружается +, для добавления символа в конец строки
 
    char* operator +(nik);//прототип метода, в котором перегружается +, для объединения строк
 
    char  operator[] (int); //прототип метода, в котором перегружается [], для получения элем по индексу
 
  /*  nik(const nik & obj) //конструктор копирования
        {
 
         return strcpy(new_string,obj.Get_string);
 
        array_size = obj.Get_size();
          array_string = new char * [array_size];
          int sizeString;
          for(int i=0; i < array_size; i++)
          {
              sizeString = obj.Get_string_size(i);
              if(sizeString>0)
              {
                  array_string[i] = new char[sizeString+1];
                  strcpy(array_string[i],obj.Get(i));
              }
          }
 
 
        } */
 
        int Get_size() const //метод получения длины строки
        {
            return strlen(new_string);
        }
 
        char *Get_string() //возвращаем символ по индексу
        {
            return new_string; //возвращаем строку
        }
 
        void Set(const char * pch) //метод, принимающий индекс и строку
        {
            if(new_string) delete [] new_string; //удаляем старую строку
            new_string = new char [strlen(pch) +1]; //заново выделяем память
            strcpy(new_string,pch); //пишем туда переданную строку
        }
 
};
 
int nik::operator =(nik obj) //перегрузка оператора = (теперь он сравнивает строки)
{
   int x = strcmp(obj.Get_string(),new_string);
           if (x == 0) {
              return 1;
            }
            else return 0;
    }
 
char*  nik::operator + (const char symbol) //перегрузка оператора + (теперь он добавляет символ в конец строки)
{
    char* box = new char [2];
    box[0] = symbol;
    cout << "box" << box << endl;
    strcat(new_string,box);
    return new_string;
    }
 
char* nik::operator + (nik obj) //что должен выполнить оператор +
{
    strcat(new_string,obj.Get_string()); //сложение строк
}
 
char nik::operator[] (int index) //возвращаем символ по индексу
{
    return new_string[index]; //возвращаем строку
}
 
int main()
{
    int size = 0;
    char str[1024];
 
//Сравнение строк (перегружен оператор =)
    cout << "Compare strings:" << endl << "String #1" << endl;
    cin >> size;
    cin >> str;
    nik string1(size);
    string1.Set(str);
 
    cout << "String #2" << endl;
    cin >> size;
    cin >> str;
    nik string2(size);
    string2.Set(str);
    if (string1 = string2) {
       cout << "Srting #1 is equal to Srting #2" << endl;
    } else cout << "Srting 1 isn't equal to Srting 2" << endl;
 
//-----------------------------------------------
 
//Добавление символа в конец строки (перегружен оператор +)
        cout << "Add to the end of the 1st string:" << endl;
        char c;
        cin >> c;
        cout << string1 + c << endl;
//-----------------------------------------------
 
//Добавление сложение строк (перегружен оператор +)
        cout << "Coupling of strings:" << endl;
        cout << string1 + string2 << endl;
//-----------------------------------------------
 
//Получение символа по индексу
        cout << "Symbol of this string by index:" << endl;
        int index = 0;
        cin >> index;
        cout << string1[index];
//-----------------------------------------------
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.02.2015, 19:09
Ответы с готовыми решениями:

Непонятные символы в консоли
Выводит непонятные символы (пики, стрелки), скрин снизу, посмотрите. Вот сам код: #include...

В консоли не выводятся русские буквы.Появляются непонятные символы
Нужно написать программу-приветствие,фамилия/имя/отчество вводятся с клавиатуры #include...

Непонятные символы при выводе русских символов в консоли
Доброго времени суток, у меня возникла проблема. Когда я ввожу текст с клавиатуры, при выводе его...

Непонятные символы
В общем, сделал функцию.Все работает, но есть одно но: если вводить строку, а введеный символ...

19
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
16.02.2015, 20:27 2
В каком именно случае? В + ты конец строки не устанавливаешь, например (box[1] = 0).
Память выделяешь и не освобождаешь. И зачем в конструкторе new, если ты сразу же NULL присваиваешь?
Массив указателей - это тоже не то, что у тебя.
0
0 / 0 / 0
Регистрация: 04.02.2015
Сообщений: 22
16.02.2015, 21:18  [ТС] 3
Цитата Сообщение от nmcf Посмотреть сообщение
В каком именно случае? В + ты конец строки не устанавливаешь, например (box[1] = 0).
nmcf, не подскажите, как установить конец строки?

Добавлено через 16 минут
Спасибо!
Теперь всякий мусор выдает только в этом случае:
C++
1
2
3
4
5
void nik::operator + (nik obj) //что должен выполнить оператор +
{
    strcat(new_string,obj.Get_string()); //сложение строк
 
}
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
16.02.2015, 21:23 4
Цитата Сообщение от nik2397 Посмотреть сообщение
Теперь всякий мусор выдает только в этом случае:
Дополнительную память под добавляемые символы кто выделять будет?
1
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,668
16.02.2015, 21:26 5
C++
1
2
3
    char box[2];
    box[0] = symbol;
    box[1] = '\0';
Ты не учитываешь, что в new_string может не быть места для добавления, у тебя же никакой запас не предусмотрен, значит надо перевыделять память.
1
0 / 0 / 0
Регистрация: 04.02.2015
Сообщений: 22
16.02.2015, 21:35  [ТС] 6
Renji, Если не трудно, покажите как
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
16.02.2015, 21:39 7
Цитата Сообщение от nik2397 Посмотреть сообщение
Renji, Если не трудно, покажите как
C++
1
2
3
4
char*str=(char*)malloc(128);//выделяем 128 байт
strcpy(str,"1234");//записываем в них строчку
str=(char*)realloc(str,256);//увеличиваем объем выделенного блока до 256 байт
free(str);//и освобождаем память
1
0 / 0 / 0
Регистрация: 04.02.2015
Сообщений: 22
16.02.2015, 21:47  [ТС] 8
Renji, А в c++ аналоги malloc и realloc есть?
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
16.02.2015, 21:54 9
Цитата Сообщение от nik2397 Посмотреть сообщение
Renji, А в c++ аналоги malloc и realloc есть?
В C++ есть std::string или std::vector с готовыми методами перераспределения памяти (внутри которых наверняка лежит тот же самый realloc). Но вам, как я понимаю, нужно реализовать стринг вручную, а значит надо откатываться на C.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
16.02.2015, 22:01 10
Цитата Сообщение от nik2397 Посмотреть сообщение
А в c++ аналоги malloc и realloc есть?
нет
но можно сделать так
C++
1
2
3
4
5
6
7
8
char * buf=new[128];// выделяем память
 
.................................
// где то нехватило
char *newBuf=new[256];// выделяем новую память 
////как то копируем из старой в новую
delete []buf;// удаляем старую память
buf=newBuf; // присваиваем указателю адрес новой памяти
Добавлено через 56 секунд
Цитата Сообщение от nik2397 Посмотреть сообщение
А в c++ аналоги malloc и realloc есть?
я не совсем прав
в С++ нет аналогов, но есть сами malloc и realloc
0
0 / 0 / 0
Регистрация: 04.02.2015
Сообщений: 22
16.02.2015, 22:03  [ТС] 11
Спасибо! Но у меня теперь другая проблема В своем старом варианте я поменял местами в main так
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
//Cложение строк (перегружен оператор +)
     cout << "Coupling of strings:" << endl;
     string1 + string2;
     cout << string1.Get_string() << endl;
//-----------------------------------------------
 
//Сравнение строк (перегружен оператор =)
    if (string1 = string2) {
       cout << "Srting #1 is equal to Srting #2" << endl;
    } else cout << "Srting 1 isn't equal to Srting 2" << endl;
 
//-----------------------------------------------
 
 
//Добавление символа в конец строки (перегружен оператор +)
        cout << "Add to the end of the 1st string:" << endl;
        char c;
        cin >> c;
        string1 + c;
        cout << string1.Get_string() << endl;
 
//-----------------------------------------------
 
 
//Получение символа по индексу
        cout << "Symbol of this string by index:" << endl;
        int index = 0;
        cin >> index;
        cout << string1[index];
//-----------------------------------------------
И почему-то все сразу заработало!

Добавлено через 51 секунду
Может у меня в перегрузке проблемы?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
16.02.2015, 22:04 12
Цитата Сообщение от nik2397 Посмотреть сообщение
И почему-то все сразу заработало!
и даже это
Цитата Сообщение от nik2397 Посмотреть сообщение
if (string1 = string2)
0
0 / 0 / 0
Регистрация: 04.02.2015
Сообщений: 22
16.02.2015, 22:06  [ТС] 13
ValeryS, Да!
( = же перегружен)
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
16.02.2015, 22:09 14
Цитата Сообщение от nik2397 Посмотреть сообщение
= же перегружен
т.е перегрузили присвоение на сравнение оригинально
а как присваивать?
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
16.02.2015, 22:11 15
Цитата Сообщение от nik2397 Посмотреть сообщение
И почему-то все сразу заработало!
В этом и прелесть выхода за границы выделенной памяти - ошибка может проявить себя когда угодно и как угодно. Или вовсе не проявить, если на то будет воля великого Рандома.
0
0 / 0 / 0
Регистрация: 04.02.2015
Сообщений: 22
16.02.2015, 22:13  [ТС] 16
ValeryS, У меня задание в лабе перезагрузить оператор присваивания)
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
16.02.2015, 22:16 17
Цитата Сообщение от nik2397 Посмотреть сообщение
У меня задание в лабе перезагрузить оператор присваивания)
ну уж никак, не на сравнение
требовалось, скорее всего, вот это
C++
1
2
MyString str1="bla-bla";
MyString str2=str1;
0
0 / 0 / 0
Регистрация: 04.02.2015
Сообщений: 22
16.02.2015, 22:22  [ТС] 18
ValeryS, Вот задание:

Вариант 4

Описать класс "строка" на основе char*, позволяющий выполнять основные операции - сравнение, конкатенация (слияние), добавление символа в конец строки, получение символа по индексу. Все операции реализовать в виде перегрузки операторов. Программа должна содержать меню, позволяющее осуществлять проверку всех методов.

Общее для всех вариантов

Реализовать конструктор копирования и перегрузить операцию присваивания.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
16.02.2015, 22:26 19
Цитата Сообщение от nik2397 Посмотреть сообщение
перегрузить операцию присваивания.
ну и во что её перегрузить? неужели в сравнение?
тем более что сравнение отдельным пунктом
Цитата Сообщение от nik2397 Посмотреть сообщение
операции - сравнение,
0
0 / 0 / 0
Регистрация: 04.02.2015
Сообщений: 22
16.02.2015, 22:26  [ТС] 20
Поменял = на ==, ниче не изменилось)
0
16.02.2015, 22:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2015, 22:26
Помогаю со студенческими работами здесь

Непонятные буквы вместо русских символов в консоли
#include&quot;stdafx.h&quot; #include&quot;windows.h&quot; #include&lt;iostream&gt; #include&lt;stdlib.h&gt; using std::cout;...

Непонятные символы в строке из char
Добрый вечер. Имеется данный код: char szResponse; recv(clientSock, &amp;szResponse,...

Выводятся непонятные символы В ФАЙЛ
Столкнулся с проблемой. Сначала при выводе в консоль была проблема, но поправил setlocale(LC_ALL,...

непонятные символы. как убрать?
Разделить строку на несколько строк длины к. Программа вроде работает, но после символов появляются...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru