Ввод строк в цикле

Тема в разделе "LANGS.C", создана пользователем Keva, 1 июн 2008.

  1. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    Доброго времени суток. Хочу в массив внести данные, при первой итерации все получается последующие просто выводят строки на экран и все. В чем проблема?
    Код (Text):
    1. struct student
    2.         {
    3.                 char    name[30];
    4.                 int     group;
    5.                 int     mark[5];
    6.         };
    7.  
    8.         student gruppa[10];
    9.  
    10.         for (int i=0;i<10;i++)
    11.         {
    12.                 cout<<"Student "<<i+1<<endl;
    13.  
    14.                 cout<<"FIO: ";
    15.                 cin.get(gruppa[i].name,sizeof(gruppa[i].name));
    16.  
    17.                 cout<<"\n";
    18.         }
    19.  
    20.         getch();
    21.         return 0;
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан

    Замени на cin >> gruppa.name;


    Совместное использование iostream и stdio - дурной тон и источник ошибок.
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Хотя std::cin >> gruppa.name - нельзя, потому что ты можешь вылезти за границу массива.

    Используй std::getline.
     
  4. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    _DEN_
    Спасибо, getline то что надо было, но в цикле добавил вводе еще номера группы и при второй и последующих итерациях ввод фамилии и инициалов стал пропускаться, почему так?

    Код (Text):
    1. for (int i=0;i<10;i++)
    2.         {
    3.                 cout<<"Student "<<i+1<<endl;
    4.  
    5.                 cout<<"FIO: ";
    6.                 cin.getline(gruppa[i].name,sizeof(gruppa[i].name));
    7.  
    8.                 cout<<"Group: ";
    9.                 cin.get(gruppa[i].group;
    10.  
    11.         }
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Keva

    Да нет же, надо использовать свободный getline и name изменить с массива на std::string.

    std::getline(std::cin, gruppa.name, '\n');

    А номер группы можно брать как std::cin >> gruppa.group;

    Мля, извини, точнее не скажу - я ща слишком пьян))))))))))))))))
     
  6. Keva

    Keva New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    130
    _DEN_
    :) проблема решена, добавил getline так сказать работающий в холостую, и получилось то что надо:) А тебе спасибо!
     
  7. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Keva

    Хехехе, ну чем смог, тем помог)))))))
     
  8. zhindos

    zhindos New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    142
    getch();

    Совместное использование iostream и stdio - дурной тон и источник ошибок.


    May be... А как по-другому?
     
  9. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    На чистом С++ задача может быть решена так:

    Код (Text):
    1. #include <iostream>
    2. #include <vector>
    3. #include <string>
    4. #include <algorithm>
    5. #include <iterator>
    6.  
    7. using namespace std;
    8.  
    9. typedef struct _Student
    10. {
    11.     string      Name;
    12.     unsigned    Group;
    13.     vector<int> Mark;
    14. } Student;
    15.  
    16. void insert(Student& student)
    17. {
    18.     student.Mark.assign(5, 0);
    19.  
    20.     cout << "FIO: ";
    21.     getline(cin, student.Name); // записываем имя из потока
    22.  
    23.     cout << "Group: ";
    24.     cin >> student.Group;   // группу
    25.     cin.ignore();
    26. }
    27.  
    28. ostream& operator<<( ostream& ostr, const Student& st )
    29. {
    30.     return  ostr << "FIO: " << st.Name << endl
    31.                  << "Group: " << st.Group << endl
    32.                  << "Mark: " << st.Mark[0] << endl << endl;
    33. }
    34.  
    35. int main(int argc, char* argv[])
    36. {
    37.     vector<Student> students(10);   // вектор из 10 студентов :)
    38.     for_each(students.begin(), students.end(), insert); // заполняем
    39.  
    40.     // выводим результат
    41.     copy(students.begin(), students.end(), ostream_iterator<Student>(cout));
    42.  
    43.     cin.ignore();
    44.  
    45.     return 0;
    46. }
     
  10. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    //На правах оффтопа
    Интересный момент, который я достаточно давно обнаружил, когда сам с этим столкнулся. Когда человек уже кое-что знает о Си и программирует на нём, то при переходе на языки более высокого уровня(например С++) он всё равно будет мыслить низкоуровневыми конструкциями и писать код на С++, в плане идеологии, начнёт далеко не сразу.