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

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

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

Имя структуры - C++

24.12.2008, 01:19. Просмотров 828. Ответов 11
Метки нет (Все метки)

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

C
1
2
3
printf("\n%d. Student:\n", i+1);
printf("Name: ");
scanf("%s",aStudent[i].sName);
Что надо ввести вместо (или в дополнение) scanf?

Был бы очень признателен.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2008, 01:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Имя структуры (C++):

Структуры. Случайное имя и добавить нового студента - C++
Подскажите как в функции Random сделать ввод случайным. Чтоб имя и фамилия студентов - был случайный набор символов. Писал через ...

Структуры (вычислить самое распространенное женское имя) - C++
Доброго времени суток! Не могу понять почему у меня строка не копируется. Решил заранее проверить вывод на экран. Вобще необходимо из...

Структуры. Определить имя самой высокой девочки в группе - C++
С помощью структуры описать данные на группу из семи детей, указав их имя , пол и рост.Определить имя самой высокой девочки в группе. Вот...

Что означает имя переменной в конце объявления структуры? - C++
Всем привет. Что значит такая запись в конце структуры? }*head; И что было бы, если было бы так: }head;? struct Link ...

С помощью структуры определить группу из 7 человек, имя, пол и рост - C++
С помощью структуры определить группу из 7 человек.имя пол и рост. вывести самую высокую девочку из группы #include<iostream> ...

Структуры.Фамилия, Имя, Отчество Группа Домашний адрес, Телефон Электронная пошта - C++
Структуры. Notebook:Фамилия, Имя, Отчество, Домашний адрес, Телефон Электронная пошта.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Vourhey
Почетный модератор
6481 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
24.12.2008, 01:45 #2
Имя какой структуры ты тут вводишь? По-моему, просто атрибут объекта...
0
hunnyh
0 / 0 / 0
Регистрация: 24.12.2008
Сообщений: 4
24.12.2008, 03:11  [ТС] #3
Я не силен в программировании
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <iostream.h>
 
typedef struct {
    char sName[128];
    long int fGroup;
        int aMark[5];
} STUDENT;
 
void main(void) {
     int bFilledMassive = 0;
     int bEmptyList = 1;
     STUDENT aStudent[15];
     int i = 0;
     int j = 0;
     int option = 0;
     int iStudentCount = 10;
    while (1) {
                printf("\nMenu:\n");
        printf("1. Fill STUDENT massive.\n");
        printf("2. Show STUDENT list.\n");
        printf("0. Exit.\n");
 
        do {
            option = getch() - '0';
        } while (option > 3);
 
        if (option == 0) {
            break;
        }
 
        switch (option) {
        case 1:
                        if(bFilledMassive == 1)
                        {
                                printf("\n\nSTUDENT massive is already filled!");
                        }
                        else
                        {
                                for (i = 0; i < iStudentCount; i++)
                                {
                                        printf("\n%d. Student:\n", i+1);
                                        printf("Name: ");
                                        scanf("%s",aStudent[i].sName);
                                        printf("Group number: ");
                                        scanf("%D", &aStudent[i].fGroup);
                                        printf("Enter marks(delay by space, for example: 1 2 3 4 5):\n", i);
                                        scanf("%d %d %d %d %d", &aStudent[i].aMark[0], &aStudent[i].aMark[1], &aStudent[i].aMark[2], &aStudent[i].aMark[3], &aStudent[i].aMark[4]);
                                        printf("\n");
                                }
                        }
                        bFilledMassive = 1;
            break;
        case 2:
            if(bFilledMassive == 0)
                        {
                                printf("\n\nPlease Fill STUDENT massive!\n");
                        }
                        else
                        {
                             long int str;
                             char str1[128];
                             for (i = 0; i < iStudentCount; i++)
                             {
                                for (j = 0; j < iStudentCount - 1; j++)
                                {
                                        float iSum = (aStudent[j].aMark[0] + aStudent[j].aMark[1] + aStudent[j].aMark[2] + aStudent[j].aMark[3] + aStudent[j].aMark[4])/5;
                                        if(iSum >= 4)
                                        {
                                                if(aStudent[j].fGroup > aStudent[j+1].fGroup)
                                                {
                                                        str = aStudent[j].fGroup;
                                                        aStudent[j].fGroup = aStudent[j+1].fGroup;
                                                        aStudent[j+1].fGroup = str;
 
                                                        strcpy(str1, aStudent[j].sName);
                                                        strcpy(aStudent[j].sName, aStudent[j+1].sName);
                                                        strcpy(aStudent[j+1].sName, str1);
                                                }
                                        }
                                }
                             }
                             for (i = 0; i < iStudentCount; i++)
                             {
                                float iSum = (aStudent[i].aMark[0] + aStudent[i].aMark[1] + aStudent[i].aMark[2] + aStudent[i].aMark[3] + aStudent[i].aMark[4])/5;
                                if(iSum >= 4)
                                {
                                        bEmptyList = 0;
                                        cout << aStudent[i].fGroup;
                                        printf(" %s\n", aStudent[i].sName);
                                }
 
                             }
                             if (bEmptyList)
                             {
                                printf("\nNo students with total mark above 4.0!\n");
                             }
                        }
            break;
        }
    }
}
Вот текст всей программы. Не мог ли кто-нибудь оценить на наличие ошибок (по моему в сортировке есть минимум одна, т.к. выводит она не "тех" студентов, что надо )

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

Если кто-нибудь поможет буду благодарен.
0
XuTPbIu_MuHTAu
Эксперт С++
2224 / 739 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
24.12.2008, 04:36 #4
Код
gets(aStudent[i].sName);
0
hunnyh
0 / 0 / 0
Регистрация: 24.12.2008
Сообщений: 4
24.12.2008, 04:44  [ТС] #5
Спасибо. Problem seems solved.
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
24.12.2008, 05:15 #6
gets нельзя юзать (эту функцию отрицают её авторы)

scanf("\t%[^\n]", aStudent[i].sName);

пользователь может ввести очень длинную строку, чтобы сломать программу, поэтому необходимо встраивать ограничитель на максимально допустимое число символов, которое пользователь может ввести
fgets имеет такой ограничитель, но на её основе можно написать более простую версию getline, которая принимает строку и ограничитель (получится типа gets'а) в C++ вроде уже есть такая в виде метода для потока ввода
0
XuTPbIu_MuHTAu
Эксперт С++
2224 / 739 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
24.12.2008, 05:42 #7
accept, человеку,который "не силен в программировании " - можно. Сдаст зачеты в инсте и забудет про все это.
Тем,кто разбирается итак понятно, что и почему нельзя юзать. Кстати, уже не в первый раз замечаю,что высказывание типа "Линус Торвальдс сказал так не делать", "Бьерн Страуструп пишет,что это плохой стиль" и т д, бесполезны. Приводите аргументацию,а не ссылки на авторитетов. Готов поспорить, я могу найти противоречивые слова одного и того же человека, даже если он и программист мирового уровня. Это в природе людей.

Раз уж завели эту тему,объясню новичкам, что количество символов, которые будут записаны в буффер после вызова этой ф-ии, теоретически не ограничено(практически это значит,что для любого размера буффера,выделенного под ввод, можно ввести более длинную строку). Это создает идеальную почву для атак на переполнение буффера.

Извини,accept,когда отвечал не заметил правку.
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
24.12.2008, 11:49 #8
Код
typedef struct {
    char sName[128];
    long int fGroup;
        int aMark[5];
} STUDENT;
в его структуре достаточно послать строку 151 символ чтобы стереть её всю
0
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
25.12.2008, 01:11 #9
Очень интересный и нужный вопрос!
Так как же всё-таки поставить ограничение?
Если попробовать
Код
scanf("\t%[^\n]", str);
то при объявлении str как char str [5] и при вводе более 4 символов, программа не работает.
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
25.12.2008, 01:32 #10
так они обе такие, просто у него там scanf везде

для ограничения fgets

вот getline от авторов, я не знаю от двух или на этот раз уже от одного
C
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <string.h>
 
/* getline:  считывает строку и возвращает её длину */
int getline(char *line, int max)
{
    if (fgets(line, max, stdin) == NULL)
        return 0;
    else
        return strlen(line);    
}
0
.::.DIMA.::.
143 / 143 / 4
Регистрация: 26.10.2008
Сообщений: 782
25.12.2008, 01:42 #11
Спасибо!
Вспомнил про функцию cin.getline - у нею ствится ограничение для ввода.
0
hunnyh
0 / 0 / 0
Регистрация: 24.12.2008
Сообщений: 4
25.12.2008, 11:30  [ТС] #12
Код
printf("\n%d. Student:\n", i+1);
                                        printf("Name: ");
										if(i > 0){
											char govno[10];
											gets(govno);
										}
                                        gets(aStudent[i].sName);
Вот так решили проблему.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2008, 11:30
Привет! Вот еще темы с ответами:

Структуры. Записать отдельно имя и фамилию и отдельно числа - C++
Есть текстовый файл по типу : Ivanov Ivan 4 8 5 9 Petrov Petr 5 2 3 4 Ktoto Tam 5 4 1 2 Есть структура: struct My { ...

Помещение структуры в вектор, удаление структуры, изменение элементов структуры - C++
Здравствуйте. Помогите разобраться с тем, как: 1 - находить элементы в векторе зная уникальный элемент структуры. 2 - удалять...

Форматный ввод/вывод: имя, второе имя или инициал, фамилия - C++
Напишите программу, считывающую имя человека в таком формате: имя, второе имя или инициал, фамилия. Затем программа выводит имя в следующем...

Нюансы синтаксиса: что означает запись return класс (имя, имя) ? - C++
Добрый день! Столкнулся в одном из кодов (приводится ниже, из книги Лафоре) с незнакомым мне синтаксисом. return time12(pm, hrs12,...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.12.2008, 11:30
Ответ Создать тему
Опции темы

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