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

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

04.11.2014, 23:09. Просмотров 966. Ответов 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;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2014, 23:09
Ответы с готовыми решениями:

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

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

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

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

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

3
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4764 / 2423 / 677
Регистрация: 18.10.2014
Сообщений: 4,143
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 / 0
Регистрация: 13.11.2012
Сообщений: 20
04.11.2014, 23:22  [ТС] 3
TheCalligrapher, в процитированных вами строках проблем не может быть в принципе, так как: если неактивны строки с 55 по 62, то все работает отлично
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4764 / 2423 / 677
Регистрация: 18.10.2014
Сообщений: 4,143
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;...

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


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

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

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