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

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

Восстановить пароль Регистрация
 
hunnyh
0 / 0 / 0
Регистрация: 24.12.2008
Сообщений: 4
24.12.2008, 01:19     Имя структуры #1
Здравствуйте. Надо ввести имя структуры, чтобы в ней присутствовали пробелы.

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

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

C++ Составить программу, которая вводит с клавиатуры имя и год рождения лица и выводит на экран "Привет Имя, тебе Р лет:).
C++ как вывести имя программы? именно имя, то что видно в провонике example.exe
C++ Структуры (вычислить самое распространенное женское имя)
Структуры.Фамилия, Имя, Отчество Группа Домашний адрес, Телефон Электронная пошта C++
Дана строка вида «Фамилия Имя Отчество». Получить строку вида Имя Отчество C++
C++ С помощью структуры определить группу из 7 человек, имя, пол и рост
Форматный ввод/вывод: имя, второе имя или инициал, фамилия C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6470 / 2245 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
24.12.2008, 01:45     Имя структуры #2
Имя какой структуры ты тут вводишь? По-моему, просто атрибут объекта...
hunnyh
0 / 0 / 0
Регистрация: 24.12.2008
Сообщений: 4
24.12.2008, 03:11  [ТС]     Имя структуры #3
Я не силен в программировании
Код
#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;
        }
    }
}
Вот текст всей программы. Не мог ли кто-нибудь оценить на наличие ошибок (по моему в сортировке есть минимум одна, т.к. выводит она не "тех" студентов, что надо )

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

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

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

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

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

Извини,accept,когда отвечал не заметил правку.
accept
4838 / 3237 / 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 символ чтобы стереть её всю
.::.DIMA.::.
142 / 142 / 4
Регистрация: 26.10.2008
Сообщений: 782
25.12.2008, 01:11     Имя структуры #9
Очень интересный и нужный вопрос!
Так как же всё-таки поставить ограничение?
Если попробовать
Код
scanf("\t%[^\n]", str);
то при объявлении str как char str [5] и при вводе более 4 символов, программа не работает.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
25.12.2008, 01:32     Имя структуры #10
так они обе такие, просто у него там scanf везде

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

вот getline от авторов, я не знаю от двух или на этот раз уже от одного
Код
 
#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);    
}
.::.DIMA.::.
142 / 142 / 4
Регистрация: 26.10.2008
Сообщений: 782
25.12.2008, 01:42     Имя структуры #11
Спасибо!
Вспомнил про функцию cin.getline - у нею ствится ограничение для ввода.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2008, 11:30     Имя структуры
Еще ссылки по теме:

C++ Структуры. Записать отдельно имя и фамилию и отдельно числа
C++ Структуры. Случайное имя и добавить нового студента
Структуры. Определить имя самой высокой девочки в группе C++
C++ Нюансы синтаксиса: что означает запись return класс (имя, имя) ?
C++ Что означает имя переменной в конце объявления структуры?

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

Или воспользуйтесь поиском по форуму:
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);
Вот так решили проблему.
Yandex
Объявления
25.12.2008, 11:30     Имя структуры
Ответ Создать тему
Опции темы

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