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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.72
sunplant
0 / 0 / 0
Регистрация: 07.04.2010
Сообщений: 11
#1

Не прекращается ввод при вводе пустой строки - C++

10.06.2010, 11:56. Просмотров 3805. Ответов 13
Метки нет (Все метки)

Подскажите, пожалуйста, почему у меня не происходит прерывание цикла при вводе пустой строки вместо имени студента:

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
#include <iostream>
using namespace std;
const int SLEN = 30;
struct student {
        char fullname[SLEN];
        char hobby[SLEN];
        int ooplevel;
};
 
int getinfo(student pa[], int n);
 
int main()
{
        student ps[2];  
        int number = getinfo(ps, 2); 
        cout << number << endl;
        return 0;
}
 
int getinfo(student pa[], int n)
{
        int i;
        for (i=0; i < n; i++)
        {
                cout << "Enter fullname #" << i + 1 << ": ";               
                while (cin >> pa[i].fullname == " ")
                              break;                
                cout << "Enter hobby #" << i + 1 << ": ";
                cin >> pa[i].hobby;               
                cout << "Enter ooplevel #" << i + 1 << ": ";
                cin >> pa[i].ooplevel;
                }   
        cout << "Out!" << endl;
                return i;
                        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2010, 11:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не прекращается ввод при вводе пустой строки (C++):

Копирование строки. При вводе пробела программа пропускает последующий ввод данных - C++
char st, st1; int k, m, i, j; system(&quot;cls&quot;); cout &lt;&lt;&quot;Введите строку&quot;&lt;&lt;endl; cin &gt;&gt;st; cout &lt;&lt;&quot;Введите номер символа,...

Ввод пустой строки и ее запись в переменную - C++
Нужно вводить в консоли несколько строк подряд, среди которых может быть пустая. Ввожу первую, нажимаю enter, ввожу следующую и т.д. Это...

Ввод и проверка при вводе чисел в диалогах - C++
Никаких проблем не возникает при вводе десятичных чисел. А вот с шестнадцатиричными как быть? Есть ли изящное решение?

При вводе дробного числа происходит бесконечный ввод - C++
При вводе дробного числа происходит бесконечный ввод, а при вводе целого все ок. #include &lt;iostream&gt; using namespace std; ...

Как сделать так, что бы длинна строки сама менялась при вводе строки? - C++
Есть такой код #include &quot;stdafx.h&quot; #include &quot;enter.h&quot; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;iostream&gt; #include...

Ввод чисел, при вводе нуля - вывод количества цифр, идущих по порядку - C++
Задача: пользователь вводит числа, при вводе нуля необходимо вывести кол-во чисел, которые шли по порядку(например: 2867524560 --&gt;...

13
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
10.06.2010, 12:04 #2
Для сравнения строк используется функция strcmp.
0
sunplant
0 / 0 / 0
Регистрация: 07.04.2010
Сообщений: 11
10.06.2010, 12:24  [ТС] #3
Это должно выглядеть вот так?

if (strcmp(pa[i].fullname, " ") == 0)
break;
0
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
10.06.2010, 12:25 #4
А надо чобы прекращался цикл? Попробуйте cin.getline( pa[i].fullname, SLEN);
Что вообще должно происходить при вводе пустой строки?
0
Андрейка
419 / 223 / 27
Регистрация: 25.03.2009
Сообщений: 744
10.06.2010, 12:30 #5
sunplant, лучше используйте std::string там перегружен оператор == и строки можете сравнивать как s1 == s2 , где s1, s2 - объекты класса std::string.
0
sunplant
0 / 0 / 0
Регистрация: 07.04.2010
Сообщений: 11
10.06.2010, 12:31  [ТС] #6
Да. но условием выступает массив, а не строка, а ввод должен прекращаться либо после наполнения массива, либо при вводе пустой строки вместо имени студента.
0
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
10.06.2010, 12:36 #7
можно так
C++
1
2
3
cin.getline ( pa[i].fullname, SLEN);
if (strlen(pa[i].fullname)==0)
break;
1
sunplant
0 / 0 / 0
Регистрация: 07.04.2010
Сообщений: 11
10.06.2010, 12:43  [ТС] #8
Да, NNN777, все сработало, спасибо!
0
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
10.06.2010, 12:52 #9
Цитата Сообщение от sunplant Посмотреть сообщение
ввод должен прекращаться либо после наполнения массива, либо при вводе пустой строки вместо имени студента.
Сорри, но мой вариант не будет работать на переполнение массива ((( cin.getline наполнит массив на сколько это можно и успокоится, а остальные введенные символы останутся в входном потоке... Цикл не завершится...
0
kazak
3035 / 2356 / 155
Регистрация: 11.03.2009
Сообщений: 5,402
Завершенные тесты: 1
10.06.2010, 13:00 #10
Цитата Сообщение от sunplant Посмотреть сообщение
а ввод должен прекращаться либо после наполнения массива, либо при вводе пустой строки вместо имени студента.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        for (i=0; i < n; i++)
        {
                cout << "Enter fullname #" << i + 1 << ": ";               
                              cin >> pa[i].fullname;
                              if (!strcmp(pa[i].fullname, " ")
                                 break;                            
                cout << "Enter hobby #" << i + 1 << ": ";
                cin >> pa[i].hobby;               
                cout << "Enter ooplevel #" << i + 1 << ": ";
                cin >> pa[i].ooplevel;
                }       
                cout << "Out!" << endl;
                return i;
                        }
1
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
10.06.2010, 13:06 #11
Если считать, что если размер строки 10, это 9 символов и 10-й символ конца строки, то
C++
1
2
3
 cin.getline ( pa[i].fullname, SLEN+1);         
if (strlen(pa[i].fullname)==0||pa[i].fullname[SLEN-1]!='\0')
    break;
Правда, не знаю, насколько это правильно
0
sunplant
0 / 0 / 0
Регистрация: 07.04.2010
Сообщений: 11
10.06.2010, 14:44  [ТС] #12
Уважаемый kazak. попробовал этот вариант, но он не работает.

Добавлено через 34 минуты
Уважаемый NNN777, может быть лучше вот так?

cin.getline(pa[i].fullname, SLEN+1);
if (strlen(pa[i].fullname)==0 || pa[i].fullname[SLEN] =='\0')
break;
0
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
10.06.2010, 15:00 #13
sunplant, можно и так просто у меня узначально ullname нульбайтами инициализировался, поэтому так не сработало бы, а если не инициализировать, работает)
0
sunplant
0 / 0 / 0
Регистрация: 07.04.2010
Сообщений: 11
10.06.2010, 15:05  [ТС] #14
Понял!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2010, 15:05
Привет! Вот еще темы с ответами:

при некорректном вводе cin далее уже не принимает ввод, не понимаю почему? - C++
В условии if (cin &gt;&gt; A &gt;&gt; B) {...} при некорректном вводе cin далее уже не принимает ввод, не понимаю почему. Вот строчки int main() ...

Почему при вводе числа программа работает нормально, а при вводе буквы уходит в бесконечный цикл? - C++
void mainmenu() { cout &lt;&lt; &quot;Введи число&quot; &lt;&lt; endl; cin &gt;&gt; choice; if (choice == 1) { cout &lt;&lt; &quot;Hello&quot; &lt;&lt; endl; } ...

Ошибка при вводе строки ! - C++
Точнее не ошибка а не могу ввести строку(не вводится)! Подскажите в чём дело, заранее благодарен! Вот код, функция void vvod(char **D) ...

при заполнении строк, начинается с пустой строки - C++
Добрый вечер, решил попробовать поработать с файлами и столкнулся с такой проблемой: после того, как я выберу (к примеру) ввести 2...


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

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

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