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

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

Войти
Регистрация
Восстановить пароль
 
 
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 180
#1

Массивы и строки - жесткая ошибка с - C++

25.10.2012, 20:24. Просмотров 587. Ответов 15
Метки нет (Все метки)

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
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
 
 
 
///////////////////////////////////////////////////////////////////////
class employee
{
private:
    long number;
    string name;
public:
    employee()
    {
        number = 0;
        name [0] = '\0';
    }
    void getdata()
    {
        cout << "Введите номер: "; cin >> number;
        cout << "Введите имя: "; cin >> name;
    }
    void putdata()
    {
        cout << "Номер: " << number << ", имя: " << name << endl;
    }
};
///////////////////////////////////////////////////////////////////////
int main ()
{
    system("chcp 1251 >nul");
  
    employee emp [100];
    char ch;
    int n=0;
    
    do
    {
        emp [n++].getdata();
        cout << "Продолжить (y/n): "; cin >> ch;
    }
    while( ch != 'n');
    
    for(int j=0 ; j<n ; j++)
    {
        emp [j].putdata();
    }
 
    system("pause");
    return 0;
}


Добавлено через 54 минуты
В чем ошибка-то?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2012, 20:24
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массивы и строки - жесткая ошибка с (C++):

В чем ошибка? (Строки. Массивы. Указатели) - C++
Всем добрый вечер. Объясните пожалуйста в чём ошибка в строке с коментарием &quot;ошибка&quot; ? class CMyString{ char *pStr; ...

Массивы и строки - C++
Помогите пожалуйста написать программу в visual studio 2005.Само задание:Написать программу коротая вводит с клавиатуры массив из 10 целых...

Массивы и строки - C++
Здравствуйте, у меня есть просьба ко всем программистам владеющим С++. У меня сейчас такое положение, что если завтра (6.02.10) я не сдам...

Массивы и строки - C++
Здравствуйте! тут вот в задаче проблема есть. Задание состоит в следующем: нужно прочесть из файла последовательность чисел и эти числа...

массивы, строки с++ - C++
помогите пожалуйста! 1. (одномерные массивы) Найти сумму элементов массива, расположенных после минимального элемента. Ввод исходных...

Массивы и строки ... - C++
Помогите пожалуйста решить задачу ... 1) В поезде 18 вагонов, в каждом из которых 36 мест. Информация о проданных на поезд билетах...

15
soft.creator
104 / 104 / 4
Регистрация: 17.10.2010
Сообщений: 283
25.10.2012, 20:25 #2
Как насчет память выделить перед этим?
C++
1
name [0] = '\0';
И вообще, а зачем это надо?
0
Croessmah
Эксперт CЭксперт С++
13513 / 7671 / 866
Регистрация: 27.09.2012
Сообщений: 18,886
Записей в блоге: 3
Завершенные тесты: 1
25.10.2012, 20:29 #3
А где происходит ошибка? При каких обстоятельствах? У меня все работает на студии
0
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 180
25.10.2012, 22:27  [ТС] #4
Цитата Сообщение от soft.creator Посмотреть сообщение
Как насчет память выделить перед этим?
C++
1
name [0] = '\0';
И вообще, а зачем это надо?
Тобишь выделить? Массив объектов инициирован, переменные определены.
А по поводу: name [0] = '\0'; - видел в книге Лафоре. Подумал стандартный ход конструктора класса для строк.

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

Добавлено через 1 час 29 минут
Заметил, что если просто нажать на крест чтобы убрать окно консоли - то все нормально. Если же нажать клавишу любую, то происходит ошибка. Попробовал в QT - но там только нажатием на крест можно закрыть консоль. С другими моими прогами все нормально и такой ошибки нет.

Добавлено через 22 минуты
Изменил метод getdata и теперь все нормально закрывается и работает. В чем был прикол не понимаю.

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
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
 
 
 
///////////////////////////////////////////////////////////////////////
class employee
{
private:
    long number;
    string name;
public:
    employee()
    {
        number = 0;
    }
    void getdata()
    {
        cout << "Введите номер: "; (cin>> number).get();
        cout << "Введите имя: "; getline(cin, name);
    }
    void putdata()
    {
        cout << "Номер: " << number << ", имя: " << name << endl;
    }
};
///////////////////////////////////////////////////////////////////////
int main ()
{
    system("chcp 1251 >nul");
  
    employee emp [100];
    char ch;
    int n=0;
    
    do
    {
        emp [n++].getdata();
        cout << "Продолжить (y/n): "; cin >> ch;
    }
    while( ch != 'n');
    
    for(int j=0 ; j<n ; j++)
    {
        emp [j].putdata();
    }
 
    system("pause");
    return 0;
}
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.10.2012, 00:45 #5
Цитата Сообщение от Croessmah Посмотреть сообщение
У меня все работает на студии
А у меня всё не работает. Здесь:
C++
1
name [0] = '\0';
попытка по индексу обратиться к пустой строке. Если уж делать, то так:
C++
1
name = "\0";
Добавлено через 3 минуты
Цитата Сообщение от FliXis Посмотреть сообщение
Изменил метод getdata и теперь все нормально закрывается и работает.
Разве только это изменили?
0
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 180
26.10.2012, 12:29  [ТС] #6
Цитата Сообщение от alsav22 Посмотреть сообщение
Разве только это изменили?
Да, ну в конструкторе еще удалил name [0] = '\0'; - но это я и раньше убирал - не помогало. Помогла именно замена в методе.
А name [0] = '\0'; не нужна совершенно для string.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.10.2012, 13:50 #7
Цитата Сообщение от FliXis Посмотреть сообщение
но это я и раньше убирал - не помогало
Не понятно тогда, почему у меня (студия 2010) код из первого поста (если сделать name = "\0") нормально отрабатывает? Среда какая? 12 Студия?

Добавлено через 4 минуты
От реализации, наверное, зависит. Сейчас попробовал в Code Blocks (mingv). Код из первого поста (без всяких изменений) отрабатывает без ошибок.
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
26.10.2012, 14:17 #8
не отрабатывает в debug версии, так как в debug билдах на visual studio есть жесткие проверки по-умолчанию, например проверки выхода за границы контейнеров (сюда входят и строки). Обращение к пустой строке по нулевому индексу вызывать ошибку, так как строка пока пуста (никаких завершающий нулей std::string не хранит, это ни к чему).

А вообще конструкция такого вида (std::string [0] = 0) никакого смысла не имеет.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.10.2012, 14:36 #9
Цитата Сообщение от Герц Посмотреть сообщение
Обращение к пустой строке по нулевому индексу вызывать ошибку
Это стандарт или у кого как? mingv же не выдаёт ошибки. Программист должен за этим следить?
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
26.10.2012, 14:37 #10
Это реализация контейнеров STL у Microsoft в дебаг версии. Соберите релиз и ошибки пропадут. В Дебаг версии там на каждое обращение по индексу стоит проверка на выход за границы.
0
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 180
26.10.2012, 18:09  [ТС] #11
Не понятно тогда, почему у меня (студия 2010) код из первого поста (если сделать name = "\0") нормально отрабатывает? Среда какая? 12 Студия?
Студия 12.

На это
C++
1
name [0] = '\0';
забейте. Я думал, что надо в string в конструкторе сделать изначально пустую строку, как в char, а потом узнал, что там и без тог отак по дефолту в string этих.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.10.2012, 18:16 #12
Цитата Сообщение от FliXis Посмотреть сообщение
забейте.
Давно забили. Вопрос в другом. Если так сделать, ошибка остаётся?
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
//#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
 
 
 
///////////////////////////////////////////////////////////////////////
class employee
{
private:
    long number;
    string name;
public:
    employee()
    {
        number = 0;
    }
    void getdata()
    {
        cout << "Введите номер: "; cin >> number;
        cout << "Введите имя: "; cin >> name;
    }
    void putdata()
    {
        cout << "Номер: " << number << ", имя: " << name << endl;
    }
};
///////////////////////////////////////////////////////////////////////
int main ()
{
    system("chcp 1251 >nul");
  
    employee emp [100];
    char ch;
    int n=0;
    
    do
    {
        emp [n++].getdata();
        cout << "Продолжить (y/n): "; cin >> ch;
    }
    while( ch != 'n');
    
    for(int j=0 ; j<n ; j++)
    {
        emp [j].putdata();
    }
 
    system("pause");
    return 0;
}
0
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 180
26.10.2012, 19:26  [ТС] #13
У меня ошибка в таком случае остается. Ну и из "глюков" нельзя вводить двойное имя, как того требовало мое задание. =)
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
26.10.2012, 19:31 #14
Цитата Сообщение от FliXis Посмотреть сообщение
У меня ошибка в таком случае остается
Вот это и не понятно. На двух компиляторах без ошибок. И по коду не видно, что там могут быть ошибки. А что конкретно вводите и сколько раз?
0
FliXis
31 / 31 / 2
Регистрация: 17.09.2012
Сообщений: 180
26.10.2012, 19:33  [ТС] #15
Ввожу номер и имя(латиница/рус без разницы). Обычно три раза. Ошибка. Один раз - тоже ошибка.
0
26.10.2012, 19:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2012, 19:33
Привет! Вот еще темы с ответами:

Массивы. Строки. - C++
1)Дан массив размера а(четное число). Поменять местами 1 и 2 половины массива. 2) Дана матрица MxN. Найти кол-во её строк, элементы...

Массивы и строки - C++
Люди помогите решить плиз:wall: Массивы: 1) Написать программу, которая вводит с клавиатуры двумерный массив и вычисляет сумму...

Массивы, строки (на С++) - C++
1ое задание: Вычислить величину (x0y0 + x2y2 + … + x30y30)/( x1y1+ x3y3 + … + x29y29) 2ое задание: Даны 6-элементные...

строки и массивы - C++
задание - написать программу, которая удаляет все цифры из строки #include &lt;iostream&gt; using namespace std; int main() { ...


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

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

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