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

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

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

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

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

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

Код
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++
Подскажите как в функции Random сделать ввод случайным. Чтоб имя и фамилия студентов - был случайный набор символов. Писал через ...

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6477 / 2252 / 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
Эксперт С++
2224 / 739 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
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
4821 / 3241 / 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
Эксперт С++
2224 / 739 / 10
Регистрация: 27.05.2008
Сообщений: 1,508
24.12.2008, 05:42     Имя структуры #7
accept, человеку,который "не силен в программировании " - можно. Сдаст зачеты в инсте и забудет про все это.
Тем,кто разбирается итак понятно, что и почему нельзя юзать. Кстати, уже не в первый раз замечаю,что высказывание типа "Линус Торвальдс сказал так не делать", "Бьерн Страуструп пишет,что это плохой стиль" и т д, бесполезны. Приводите аргументацию,а не ссылки на авторитетов. Готов поспорить, я могу найти противоречивые слова одного и того же человека, даже если он и программист мирового уровня. Это в природе людей.

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

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

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

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

как вывести имя программы? именно имя, то что видно в провонике example.exe - C++
собственно вопрос ^. это возможно? Добавлено через 18 минут догадался, кому надо ^^ #include &lt;iostream.h&gt; using std::cout; ...

Составить программу, которая вводит с клавиатуры имя и год рождения лица и выводит на экран "Привет Имя, тебе Р лет:). - C++
Буду благодарен. =(( 1. Составить программу, которая вводит с клавиатуры имя и год рождения лица и выводит на экран &quot;Привет Имя, тебе Р...

Имя класса - C++
Проблема в следующем: почему при имени класса &quot;distance&quot; программа отказывается работать?как только я меняю имя класса,например убираю...


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

Или воспользуйтесь поиском по форуму:
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     Имя структуры
Ответ Создать тему
Опции темы

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