Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
vorant
0 / 0 / 1
Регистрация: 13.11.2012
Сообщений: 20
#1

Как считать строку с консоли? - C++

04.11.2014, 23:09. Просмотров 930. Ответов 3
Метки нет (Все метки)

есть код, если раскоментить с 55-ой по 62-ую будет вылетать при первом же сеттере surname. как это вообще связано?! программа туда еще не дошла!!!!

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
#include <cstdlib>
#include <stdio.h>
#include <string.h>
#include <math.h>
 
using namespace std;
 
/*
 * 
 *
 *
 */
 
class Luggage {
private:
    char surname[20];
    int amount;
    float weight;
public:
    void setSurname (char* _surname) {strncpy(surname, _surname, sizeof(surname) - 1);}
    void setAmount (int _amount) {amount = _amount;}
    void setWeight (float _weight) {weight = _weight;}
 
    char* getSurname () {return surname;}
    int getAmount () {return amount;}
    float getWeight () {return weight;}
 
    float averageWeight () {return weight / amount;}
};
int main(int argc, char** argv) {
    int n;
    printf("n: ");
    scanf("%d", &n);
 
    Luggage passengers[n];
    for (int i = 0; i < n; i++){
        char* _surname;
        printf("%d surname: ", i + 1);
        scanf("%s", _surname);
        passengers[i].setSurname(_surname);
 
        int _amount;
        printf("%d amount: ", i + 1);
        scanf("%d", &_amount);
        passengers[i].setAmount(_amount);
 
        float _weight;
        printf("%d weight: ", i + 1);
        scanf("%f", &_weight);
        passengers[i].setWeight(_weight);
 
        puts("");
    }
 
    // int generalAmount = 0;
    // double generalWeight = 0;
    // for (int i = 0; i < n; i++){
    //  generalAmount += passengers[i].getAmount();
    //  generalWeight += passengers[i].getWeight();
    // }
    // double generalAverageWeight = 0;
    // generalAverageWeight = generalWeight / generalAmount;
 
    // printf("0.3:\n");
    // for (int i = 0; i < n; i++){
    //  if ((passengers[i].averageWeight() - generalAverageWeight) <= 0.3 and
    //          (generalAverageWeight - passengers[i].averageWeight()) <= 0.3){
    //      printf("%s\t%d\t%f\n", passengers[i].getSurname(), passengers[i].getAmount(), passengers[i].getWeight());
    //  }
    // }
    // puts("");
 
    for (int i = 0; i < n; i++){
        printf("%s\t%d\t%f\n", passengers[i].getSurname(), passengers[i].getAmount(), passengers[i].getWeight());
    }
 
    return 0;
}

http://www.cyberforum.ru/cpp-beginners/thread1914170.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2014, 23:09
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как считать строку с консоли? (C++):

Считать строку из консоли
Как в с++ получить в виде строки то, что ответила система на команду. То есть...

Считать строку с консоли
такая задачка, препод хочет чтобы мы не юзали класс string, а юзали массивы...

Считать строку из консоли
Здравствуйте. Скажите, пожалуйста, как можно считать текст из консоли,...

Считать строку из консоли
Добрый день. Как правильно написать для считывания строки из консоли? ...

Считать посимвольно строку из консоли
Добрый день! Необходимо в программе организовать считывание длинной строки из...

3
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4371 / 2346 / 654
Регистрация: 18.10.2014
Сообщений: 3,996
04.11.2014, 23:15 #2
Лучший ответ Сообщение было отмечено vorant как решение

Решение

Цитата Сообщение от vorant Посмотреть сообщение
C++
1
2
3
char* _surname;
printf("%d surname: ", i + 1);
scanf("%s", _surname);
Программа пытается выполнить чтение строки в несуществующую память, указываемую неинициализированным указателем. Поведение не определено.
0
vorant
0 / 0 / 1
Регистрация: 13.11.2012
Сообщений: 20
04.11.2014, 23:22  [ТС] #3
TheCalligrapher, в процитированных вами строках проблем не может быть в принципе, так как: если неактивны строки с 55 по 62, то все работает отлично
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4371 / 2346 / 654
Регистрация: 18.10.2014
Сообщений: 3,996
04.11.2014, 23:29 #4
Цитата Сообщение от vorant Посмотреть сообщение
в процитированных вами строках проблем не может быть в принципе
Проблема в процитированных строках совершенно очевидна и обсуждению не подлежит. Это стандартная ошибка новичка.

Цитата Сообщение от vorant Посмотреть сообщение
если неактивны строки с 55 по 62, то все работает отлично
Вам показалось. "Работать отлично" это программа не может в принципе.

В каких именно строках у вас происходит вылет не имеет никакого значения. Проблема, которую я указал выше, приводит к неопределенному поведению. Это значит, что ваша программа может вылетать где угодно, как угодно и когда угодно совершенно непредсказуемым образом. А также она может создавать иллюзию "отличной работы", на которую вы и поддались.

Пока не исправлен этот ужас с чтением строки "в никуда", искать какие-либо другие проблемы в коде никакого смысла нет. Все остальное - это детский лепет, по сравнению с катастрофой, которую вы устроили в этом 'scanf'.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.11.2014, 23:29
Привет! Вот еще темы с решениями:

Можно ли считать с консоли строку по шаблону?
например, scanf можно считать число и записать в переменную. int n;...

Каким образом нормально считать с консоли строку?
Дело в том что необходимо считывать строки вводимые с консоли. Но полноценно...

Как считать строку scanf'ом при этом не переходя на новую строку, т.е. без использования Enter'а
Как считать строку scanf'ом при этом не переходя на новую строку, т.е. без...

Как в консоли считать информацию(в массив), не учитывая enter???
День добрый всем! Нам задали программу написать, она не очень сложная , но у...


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

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

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