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

отображаются лишнии символы при выводе массива символов - C++

Восстановить пароль Регистрация
 
Султан
4 / 4 / 1
Регистрация: 11.03.2012
Сообщений: 114
20.03.2012, 20:20     отображаются лишнии символы при выводе массива символов #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
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
#include <iostream.h>
#include <string.h>          // для функций str*
///////////////////////////////////////////////////////////
class String
{
  protected:
    static const int SZ = 3;       // размер массива
    char str [ SZ ];         // массив для хранения строки
  public:
    // конструктор без параметров
    String ( )
      { str [ 0 ] = '\x0'; }
    // конструктор с одним параметром
    String ( char s [ ] )
      { strcpy ( str, s ); } // сохраняем строку в массиве
    // показ строки
    void display ( ) const
      {
      cout << str;
      }
    // перевод строки к обычному типу
    operator char* ( )
      { return str; }
 
    int givMax() const
    {
        return int(SZ);
    }
};
 
class Pstring:public String
{
    public:
        Pstring() : String() {}
        Pstring ( char s [ ] )
        {
            int dl = strlen(s);
            int max = givMax();
 
            char temp[SZ+1];
            if (dl<max) {
                strcpy ( str, s );
            }
            else
            {
                for (int i = 0; i < max; i++) {
                    temp[i] = s[i];
                }
                temp[max]='\0';
                strcpy(str,temp);
            }
        }
};
 
class Pstring2:public Pstring
{
public:
    Pstring2 () : Pstring () {}
    Pstring2( char s[]) : Pstring(s) {}
};
///////////////////////////////////////////////////////////
int main ( )
{
  wcout.imbue(locale(".866"));
 
  Pstring2 s1;                 // используем конструктор без параметров
 
  char xstr [ ] = "Hi!12345 "; // создаем обычную строку
 
  s1 = xstr;                 // неявно используем конструктор с одним параметром
 
  s1.display ( );            // показываем строку
 
  Pstring2 s2 = "123456789123456789123456789"; // снова используем конструктор с параметром
 
  cout << static_cast<char*>( s2 ); // используем оператор перевода типа
  cout << endl;
 
  system("pause");
  return 0;
}
отображается:
Hix*↕12
Для продолжения нажмите любую клавишу . . .

хотя должно только:
Hi12
Для продолжения нажмите любую клавишу . . .

В чем причина такого поведения?И как исправить?
Заранее спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
20.03.2012, 21:20     отображаются лишнии символы при выводе массива символов #2
Цитата Сообщение от Султан Посмотреть сообщение
wcout.imbue(locale(".866"));
зачем это вообще? убери

Цитата Сообщение от Султан Посмотреть сообщение
static const int SZ = 3;
такой щедрый, думаешь тут у тебя строка уместится? поставь побольше
Султан
4 / 4 / 1
Регистрация: 11.03.2012
Сообщений: 114
20.03.2012, 21:30  [ТС]     отображаются лишнии символы при выводе массива символов #3
Цитата Сообщение от sandye51 Посмотреть сообщение
Цитата Сообщение от Султан
wcout.imbue(locale(".866"));
зачем это вообще? убери
это для отображения русского языка.К сожалению единственный способ который у меня заработал
(попробовал убрать,проблема не в этом)

Цитата Сообщение от sandye51 Посмотреть сообщение
Цитата Сообщение от Султан
static const int SZ = 3;
такой щедрый, думаешь тут у тебя строка уместится? поставь побольше
Ну это как раз для проверки.Если ставить больше,то все работает,но должно ж при любых условиях работать,а не только когда свершиться чудо...и при этом значении вылазиет такая неприятность.Хочется и ее побороть.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,165
Завершенные тесты: 1
20.03.2012, 22:19     отображаются лишнии символы при выводе массива символов #4
У Вас не предусмотрено никаких проверок на превышение размера SZ.
Соответственно, поведение программы после использования
s1 = xstr;
непредсказуемо, т.к. здесь длина строки xstr больше 2 символов.
Султан
4 / 4 / 1
Регистрация: 11.03.2012
Сообщений: 114
20.03.2012, 22:24  [ТС]     отображаются лишнии символы при выводе массива символов #5
Как не предусматривается?А вот тут?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
                Pstring ( char s [ ] )
                {
                        int dl = strlen(s);
                        int max = givMax();
 
                        char temp[SZ+1];
                        if (dl<max) {
                                strcpy ( str, s );
                        }
                        else
                        {
                                for (int i = 0; i < max; i++) {
                                        temp[i] = s[i];
                                }
                                temp[max]='\0';
                                strcpy(str,temp);
                        }
                }
Как раз в s1 записывается только количество = SZ.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,165
Завершенные тесты: 1
20.03.2012, 22:36     отображаются лишнии символы при выводе массива символов #6
В этом коде в temp Вы записываете 4 значения(3 плюс 0).
strcpy(str,temp); их все копирует в str.
Ну а после выхода из конструктора нуль куда-то пропадает,
т.к. он не принадлежит массиву str.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.03.2012, 22:43     отображаются лишнии символы при выводе массива символов
Еще ссылки по теме:

C++ Русские символы при выводе массива структуры
C++ Добавляются лишние символы при выводе данных в поток
C++ При записи символов массива в txt в последнем отображаются крякозябры

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

Или воспользуйтесь поиском по форуму:
Султан
4 / 4 / 1
Регистрация: 11.03.2012
Сообщений: 114
20.03.2012, 22:43  [ТС]     отображаются лишнии символы при выводе массива символов #7
Ага.Есть такой момент.Щас покопаюсь в этом.

Добавлено через 4 минуты
Да,спасибо.Проблема решена в этом моменте.получается что сохраняется SZ-1 символов + 0.
Yandex
Объявления
20.03.2012, 22:43     отображаются лишнии символы при выводе массива символов
Ответ Создать тему
Опции темы

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