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

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

Войти
Регистрация
Восстановить пароль
 
 
MrDreher
1 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 71
#1

Нелогичная работа кода - C++

15.03.2014, 18:39. Просмотров 939. Ответов 35
Метки нет (Все метки)

Есть код. Но делает он совсем не то, что по идее должен.
Вот код:
1) файл main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//---------------------------------------------------------------------------
#include "LongNumber.hpp"
#include <iostream>
//---------------------------------------------------------------------------
using namespace std;
//---------------------------------------------------------------------------
int main()
{
        LongNumber a;
        a.setdata();
        a.view();
 
        system("pause");
        return 0;
}
//---------------------------------------------------------------------------
2) Файл LongNumber.hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef LONGNUMBER_H
#define LONGNUMBER_H
class LongNumber
{
   private:
        char num[];
        int count;
        int base;
   public:
        LongNumber();
        void setdata();
        void view();
};
#endif
3) Файл LongNumber.hpp
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
#include "LongNumber.hpp"
#include <iostream>
//---------------------------------------------------------------------------
using namespace std;
//---------------------------------------------------------------------------
LongNumber::LongNumber()
{ }
//---------------------------------------------------------------------------
void LongNumber::setdata()
{
        printf("Enter the count: ");
        scanf("%d", &count);
        printf("Enter the number: ");
        scanf("%s",num);
        printf("Enter the base: ");
        scanf("%d",&base);
}
//---------------------------------------------------------------------------
void LongNumber::view()
{
        printf ("Number = %s \n", num);
        printf ("Count = %d \n", count);
        printf ("Base = %i \n", base);
}
//---------------------------------------------------------------------------
Есть задача: ввести с клавиатуры "число"(по сути строку, т.к. число не обязательно в 10чной системе счисления), и ввести основание системы счисления введенного числа. Это метод getdata(). Метод view() должен вывести данные в консоль.
Написал код, вроде должен работать. Но, в итоге получаются какие-то дивные вещи:
1) Вводишь count - все ок. Когда вводишь num то в count уже другие значения.
2) View выводит бред взятый непонятно откуда.

Почему код работает таким странным способом? Как исправить ошибку?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2452 / 1624 / 238
Регистрация: 24.11.2012
Сообщений: 3,999
15.03.2014, 18:45     Нелогичная работа кода #2
Размер массива укажите.

Добавлено через 1 минуту

Не по теме:

Вот нафига люди подключают iostream и пишут using namespace когда не используют ни то, ни другое?



Добавлено через 1 минуту
Ссылка по теме (видимо) http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
Croessmah
15.03.2014, 18:45
  #3

Не по теме:

Цитата Сообщение от 0x10 Посмотреть сообщение
Вот нафига люди подключают iostream и пишут using namespace когда не используют ни то, ни другое?
потому что в студии там подрубается cstdio и cstdlib

MrDreher
1 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 71
15.03.2014, 18:57  [ТС]     Нелогичная работа кода #4
Цитата Сообщение от 0x10 Посмотреть сообщение
Размер массива укажите.
Размер массива заранее неизвестен. Пользователь может ввести один символ, а может и не один.
just_freelance
61 / 37 / 9
Регистрация: 15.03.2014
Сообщений: 315
15.03.2014, 19:09     Нелогичная работа кода #5
MrDreher, так выделяйте память динамически, используя указатели.
MrDreher
1 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 71
15.03.2014, 19:46  [ТС]     Нелогичная работа кода #6
Вот так работает:
1) Файл LongNumber.hpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef LONGNUMBER_H
#define LONGNUMBER_H
class LongNumber // класс длинное число
{
   private:
        int feet;
        float inches;
        
        char *num; // указатель на число
        int count; // кол-во знаков
        int base; // основание системы счисления
   public:
        LongNumber();
        LongNumber(int, float);
        void setdata();
        void view();
        LongNumber operator+ ( LongNumber ) const;
        LongNumber operator* ( LongNumber ) const;
};
#endif
Файл LongNumber.cpp
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
#include "LongNumber.hpp"
//---------------------------------------------------------------------------
LongNumber::LongNumber()
{ }
//---------------------------------------------------------------------------
// получение информации от пользователя
void LongNumber::setdata()
{
        printf("Enter the count: ");
        scanf("%d", &count);
 
        printf("Enter the number: ");
        string num_str;
        scanf("%s",num_str);
        num = &num_str[0];
        
        printf("Enter the base: ");
        scanf("%d",&base);
        printf("Enter the base: ");
}
//---------------------------------------------------------------------------
// вывод информации
void LongNumber::view()
{
        printf ("Number = %s \n", &num);
        printf ("Count = %d \n", count);
        printf ("Base = %d \n", base);
}
//---------------------------------------------------------------------------
Всем спасибо за советы/ответы.
MarVaL
С++ Beginner
116 / 116 / 16
Регистрация: 28.02.2013
Сообщений: 246
15.03.2014, 19:58     Нелогичная работа кода #7
Цитата Сообщение от 0x10 Посмотреть сообщение
Вот нафига люди подключают iostream и пишут using namespace когда не используют ни то, ни другое?

Не по теме:

Шаблон наверное

0x10
2452 / 1624 / 238
Регистрация: 24.11.2012
Сообщений: 3,999
15.03.2014, 20:05     Нелогичная работа кода #8
MrDreher, делает вид, что работает. Локальный объект num_str уничтожается после выхода из области видимости и указатель становится невалиден.
just_freelance
15.03.2014, 20:08
  #9

Не по теме:

Цитата Сообщение от MrDreher Посмотреть сообщение
num = &num_str[0];
А за такое вообще руки отрубать нужно.

rikimaru2013
15.03.2014, 20:13
  #10

Не по теме:

Цитата Сообщение от just_freelance Посмотреть сообщение
А за такое вообще руки отрубать нужно.
Потому, что вместо num = num_str он явно для себя ЯКОБЫ НАПОМИНАЕТ, что в Num адрес массива? Если рубать руки, то за то что переменная типа указатель имеет имя num, что не подскажет ему, что там char * через месяц

taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.03.2014, 20:16     Нелогичная работа кода #11
Цитата Сообщение от MrDreher Посмотреть сообщение
Размер массива заранее неизвестен.
Размер статического массива не может быть не известен.
MrDreher
1 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 71
15.03.2014, 20:16  [ТС]     Нелогичная работа кода #12

Не по теме:

Цитата Сообщение от just_freelance Посмотреть сообщение
А за такое вообще руки отрубать нужно.
Можно хоть правую оставить?



Если я в LongNumber.hpp заменяю "char *num" на "string num" при компиляции выдает ошибки:
1) Type name expected
2) Declaration missing
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.03.2014, 20:21     Нелогичная работа кода #13
Цитата Сообщение от MrDreher Посмотреть сообщение
Пользователь может ввести один символ, а может и не один.
В этот "массив" он вообще ничего ввести не может, вводить просто некуда, так как размер равен нолю.

Добавлено через 2 минуты
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Если рубать руки, то за то что переменная типа указатель имеет имя num, что не подскажет ему, что там char * через месяц
А ничего, что базовый тип указан безо всяких переименований? В моих прогах вообще все такие указатели не зависимо от фактического типа зовут Data и ничего, не путаюсь. А вот за присваивание локального адреса надо не руки рубить, а хвост.
MrDreher
15.03.2014, 20:35  [ТС]
  #14

Не по теме:


Цитата Сообщение от taras atavin Посмотреть сообщение
В моих прогах вообще все такие указатели не зависимо от фактического типа зовут Data и ничего, не путаюсь.
Гений. Можешь называть все свои переменный data, ведь это твои проблемы. Пример ты привел не очень удачный - ты не являешься примером для подражания и то что твой код может быть похож на бред сумасшедшего меня не удивит.

DrOffset
6840 / 4051 / 924
Регистрация: 30.01.2014
Сообщений: 6,855
15.03.2014, 23:16     Нелогичная работа кода #15
MrDreher, у тебя там еще одна проблема, про которую никто не сказал. Нельзя писать в объект std::string через scanf таким образом как у тебя написано.
Цитата Сообщение от MrDreher Посмотреть сообщение
C++
1
scanf("%s",num_str);
Компилятор это пропустил только потому, что в scanf эллипсис (три точки), который априори не проверяет типы.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.03.2014, 05:26     Нелогичная работа кода #16
Цитата Сообщение от MrDreher Посмотреть сообщение
и то что твой код может быть похож на бред сумасшедшего меня не удивит.
Не может, в отличие от кода ТС и твоего. Имя переменной должно говорить только о её назначении, а о типе должен говорить тип. У меня так и есть.
alkagolik
1511 / 617 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
16.03.2014, 06:07     Нелогичная работа кода #17
Цитата Сообщение от taras atavin Посмотреть сообщение
В этот "массив" он вообще ничего ввести не может, вводить просто некуда, так как размер равен нолю.
боян. в данном случае массива просто не как такового. Это Си наследованный синтаксис константного указателя. Это гавно вообще и крестов в частности. Убей себя крестами, пиши на си++.
__
Негодующий функциональщик.

Добавлено через 1 минуту
Цитата Сообщение от MrDreher Посмотреть сообщение
Если я в LongNumber.hpp заменяю "char *num" на "string num" при компиляции выдает ошибки:
1) Type name expected
2) Declaration missing
ты должен понимать разницу. Но ты ее не понимаешь и не знаешь. А если будешь пытаться писать программы на с++ то никогда и не узнаешь.
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.03.2014, 06:14     Нелогичная работа кода #18
Цитата Сообщение от alkagolik Посмотреть сообщение
в данном случае массива просто не как такового.
А почему по-твоему в кавычках?
alkagolik
1511 / 617 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
16.03.2014, 06:15     Нелогичная работа кода #19
Цитата Сообщение от taras atavin Посмотреть сообщение
А почему по-твоему в кавычках?
а кто туда сегодня где-то?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2014, 06:15     Нелогичная работа кода
Еще ссылки по теме:

C++ Работа с двумерным массивом - разобрать строку кода
C++ Разъяснение кода
C++ Сортировка Шелла работа кода
C++ Сравнить каждое слово с предыдущи. Непонятна работа кода
C++ Перевод кода

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
16.03.2014, 06:15     Нелогичная работа кода #20
Цитата Сообщение от alkagolik Посмотреть сообщение
А если будешь пытаться писать программы на с++ то никогда и не узнаешь.
Да ну! А на чём же её ещё узнавать? Неужели на бейсике, где char* просто не предусмотрен? Или ваще не прологе, где нет и string?
Yandex
Объявления
16.03.2014, 06:15     Нелогичная работа кода
Закрытая тема Создать тему
Опции темы

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