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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 5.00
Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
#1

Выход в случае ввода пустой строки - C++

09.07.2012, 14:20. Просмотров 2599. Ответов 15
Метки нет (Все метки)

Опять 25 =( Порылся в своих старых темах, опять полистал учебник, но голова не хочет соображать. Где-то допускаю ошибку и прям чую, что знаю где, но не могу понять как
Программа работает отлично, но в одной из функций нужно осуществить выход в случае пустой строки. Почему не работает break? Хотел проверить и для этого после цикла всунул cout<< i; но циклу пофиг, после ввода пробела ничего не происходит, программа дальше не работает, но можно вводить, что заблагоросудится
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int getinfo(student pa[],int n)
{
    setlocale (LC_ALL, "Russian");
    int i=0;
    while (n>0)
    {
        cout << "Введите имя студента: ";
        cin >> pa[i].fullname;
        if (pa[i].fullname==" ")
            break;
        cout << "Введите хобби студента: ";
        cin >> pa[i].hobby;
        cout << "Введите оценку студента: ";
        cin >> pa[i].ooplevel;
        i += 1;
        n--;
    }
    cout<< i;
    return i;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2012, 14:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выход в случае ввода пустой строки (C++):

Написать функцию которая бы выводила ошибки в случае неверного ввода числа - C++
#include &lt;iostream&gt; using namespace std; int cin_int(int min, int max) { while (true) { cout &lt;&lt; &quot;Please enter N : &quot;; ...

Как сделать выход из программы при условии нажатия двойного ввода - C++
Люди добрые помогите ни как не могу сообразить как сделать выход из программы при условии что пользователь нажал два раза ввод (Enter)....

Удалить из строки среднюю букву, если длина строки нечётная или две средних в противном случае - C++
Строки. Дана строка S. Удалите из неё среднюю букву, если длина строки нечётная или две средних в противном случае. Формат входных...

Учет пустой строки - C++
Как сделать учет пустой строки? Допустим, дан файл input со строками не менее 10. Первая строка - число k. Нужно перенести с k до k+5...

Считывание пустой строки - C++
юзаю std::cin для считывания в строку std::string, проблема в том что если ничего не вводить, а просто нажать enter, то программа...

Считывание пустой строки - C++
Доброго времени! Из Прата еcть такая задача: Следующее упражнение позволит попрактиковаться в написании функций, работающих с...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
soon
2540 / 1305 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
09.07.2012, 14:37 #2
Цитата Сообщение от Fooly Посмотреть сообщение
cin >> pa[i].fullname;
if (pa[i].fullname==" ")
Гениально, особенно если учесть, что std::istream::operator>> считывает до пробела/перевода строки.
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
09.07.2012, 14:37 #3
А что такое student, это тип string или собственный тип?
Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
09.07.2012, 14:41  [ТС] #4
Цитата Сообщение от yuron_477 Посмотреть сообщение
А что такое student, это тип string или собственный тип?
Это структура, на всяк случай выложу весь код

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
#include <iostream>
#include <string>
using namespace std;
 
const int SLEN=30;
struct student
{
    char fullname [SLEN];
    char hobby[SLEN];
    int ooplevel;
};
int getinfo(student pa[],int n);
void display1 (student st);
void display2 (const student * ps);
void display3 (const student pa[], int n);
int main()
{
    setlocale (LC_ALL, "Russian");
    cout << "Введите размер класса: ";
    int class_size;
    cin >> class_size;
    student * ptr_stu = new student [class_size];
    int entered = getinfo (ptr_stu, class_size);
    for (int i=0; i < entered; i++)
    {
        display1 (ptr_stu[i]);
        display2 (&ptr_stu[i]);
    }
    display3 (ptr_stu, entered);
    delete [] ptr_stu;
    cout << "Done\n";
    for (int i=0; i<100; i++)
        cin.get();
    return 0;
}
int getinfo(student pa[],int n)
{
    setlocale (LC_ALL, "Russian");
    int i=0;
    while (n>0)
    {
        cout << "Введите имя студента: ";
        cin >> pa[i].fullname;
        if (pa[i].fullname==" ")
            break;
        cout << "Введите хобби студента: ";
        cin >> pa[i].hobby;
        cout << "Введите оценку студента: ";
        cin >> pa[i].ooplevel;
        i += 1;
        n--;
    }
    cout<< i;
    return i;
}
void display1 (student st)
{
    setlocale (LC_ALL, "Russian");
    cout << endl << st.fullname << endl << st.hobby << endl << st.ooplevel;
}
void display2 (const student * ps)
{
    setlocale (LC_ALL, "Russian");
    cout << endl << ps ->fullname << endl << ps ->hobby << endl << ps ->ooplevel<< endl;
}
void display3 (const student pa[], int n)
{
    int i=0;
    setlocale (LC_ALL, "Russian");
    while (i<n)
        {cout << endl << pa[i].fullname << endl << pa[i].hobby << endl << pa[i].ooplevel << endl;
         i++;
    }
}
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.07.2012, 15:18 #5
Цитата Сообщение от Fooly Посмотреть сообщение
if (pa[i].fullname==" ")
" " это не пустая строка, а символ пробела. Пустая строка - это когда первый считываемый символ '\n'.
cin >> это не сможет обработать. Можно использовать, например, cin.get().
Например, так:
C++
1
2
3
4
5
6
7
8
9
cout << "Введите имя студента: ";
cin.get();
cin.get(pa[i].fullname, SLEN);
if (pa[i].fullname=="\n")
{ 
  cin.clear();
  cin.sync();
  break;
}
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
09.07.2012, 15:27 #6
Цитата Сообщение от alsav22 Посмотреть сообщение
Например, так:
У меня это не работает. А это работает
C++
1
2
3
4
5
6
7
8
9
cout << "Введите имя студента: ";
_flushall();
cin.getline(pa[i].fullname, SLEN);
if (pa[i].fullname[0] == ' ')
{
    cin.clear();
    cin.sync();
    break;
}
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.07.2012, 15:44 #7
Вот так правильнее:
C++
1
2
3
4
5
6
7
8
cout << "Введите имя студента: ";
cin.get();
if (!(cin.get(pa[i].fullname, SLEN)))
{ 
  cin.clear();
  cin.sync();
  break;
}
Добавлено через 12 минут
Цитата Сообщение от yuron_477 Посмотреть сообщение
У меня это не работает. А это работает
C++
1
2
3
4
5
6
7
8
9
cout << "Введите имя студента: ";
_flushall();
cin.getline(pa[i].fullname, SLEN);
if (pa[i].fullname[0] == ' ')
{
    cin.clear();
    cin.sync();
    break;
}
В вашем коде при нажатии enter выхода нет.
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
09.07.2012, 15:48 #8
C++
1
if (pa[i].fullname[0] == ' ' || pa[i].fullname[0] == '\0')
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.07.2012, 16:16 #9
Цитата Сообщение от yuron_477 Посмотреть сообщение
C++
1
if (pa[i].fullname[0] == ' ' || pa[i].fullname[0] == '\0')
Работает. Но у меня нет выхода, если пробел ввести и enter, а у вас выход, если сначала пробел, а потом имя. Тоже не гут.
Не пойму, почему у меня первый код не работает. Программа просто закрывается.

Добавлено через 15 минут
Fooly, не знаю как у вас, но у меня, в конце программы, иероглифы выводит. Чтобы был корректный ввод русских букв, нужно добавить
C++
1
#include <Windows.h>
, а в main() :
C++
1
2
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
09.07.2012, 16:22  [ТС] #10
Цитата Сообщение от alsav22 Посмотреть сообщение
Работает. Но у меня нет выхода, если пробел ввести и enter, а у вас выход, если сначала пробел, а потом имя. Тоже не гут.
Не пойму, почему у меня первый код не работает. Программа просто закрывается.

Добавлено через 15 минут
Fooly, не знаю как у вас, но у меня, в конце программы, иероглифы выводит. Чтобы был корректный ввод русских букв, нужно добавить
C++
1
#include <Windows.h>
, а в main() :
C++
1
2
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
У меня программа и закрывалась, я вставил system("pause"), но в случае приостановки цикла выводились какие-то дополнительные цифры. А на счёт вывода иероглифов - у меня тоже так было, я просто начал писать на английском
В любом случае спасибо, мне нужно было вспомнить как организовать правильно выход из цикла.
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.07.2012, 17:14 #11
Цитата Сообщение от Fooly Посмотреть сообщение
У меня программа и закрывалась, я вставил system("pause")
Я про свой первый код в 5 посте. Его не надо использовать. Вот ещё вариант. Сделать #include <cctype>:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
cout << "Введите имя студента: ";
_flushall();
cin.getline(pa[i].fullname, SLEN);
int flag = 0;
for (int j = 0; pa[i].fullname[j] != '\0'; j++)
{
    if (isgraph((unsigned char)pa[i].fullname[j]))
     {
        flag = 1; 
        break;
     } 
}
  if (flag == 0) break;
Выход будет, если пустая строка или строка без печатных символов (например, одни пробелы).

Добавлено через 14 минут
Для getline() такая конструкция,
C++
1
2
    cin.clear();
    cin.sync();
в данном случае, не нужна. Этот метод не устанавливает флаг ошибки при вводе пустой строки, и извлекает из потока символ новой строки.
salam
162 / 143 / 12
Регистрация: 10.07.2012
Сообщений: 726
10.07.2012, 10:49 #12
Цитата Сообщение от Fooly Посмотреть сообщение
Программа работает отлично
спасибо, поржал...
я хотел этим сказать, что Ваша программа изобилует логическими ошибками... Вас стоит, быть может, призадуматься об этом...
Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
17.07.2012, 11:30  [ТС] #13
Что-то опять у меня не так. Вот есть две функции. После нажатия Enter при вводе имени осуществляется переход к вводу гандикапа. Далее третья функция выводит пустое имя и введенный гандикап. Но функция, которая должна возвращать при пустом поле в имени 0, не срабатывает
Строка 18. для "\0" и "\n" не удаётся установить для первого элемента, т.е нельзя написать g.fullname[0] - пишет несовместимые типы операндов const char * и char
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void setgolf(golf & g,const char * name, int hc)
{
strcpy(g.fullname, name);
g.handicap=hc;
int res;
cout<<"Хотите изменить введёные данные?" << "\n1 = да" << "\n2 = нет\n";
cin>>res;
if (res==1)
{
cout<<"Введите имя: ";
cin.sync();
cin.getline(g.fullname,Len);
cout<<"Введите гандикап: ";
cin>>g.handicap;}
}
int setgolf (golf & g)
{
    if(g.fullname=="\0" || g.fullname[0]==' ' || g.fullname=="\n")
        return 0;
    else return 1;
}
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
17.07.2012, 13:05 #14
код
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
#include <iostream>
#include <Windows.h>
using namespace std;
const int Len = 25;
struct golf
{
    char fullname[Len];
    int handicap;
};
void setgolf(golf & g, const char * name, int hc)
{
    strcpy(g.fullname, name);
    g.handicap=hc;
    int res;
    cout<<"Хотите изменить введёные данные?" << "\n1 = да" << "\n2 = нет\n";
    cin>>res;
    if (res==1)
    {
        cout<<"Введите имя: ";
        cin.sync();
        cin.getline(g.fullname,Len);
        cout<<"Введите гандикап: ";
        cin>>g.handicap;}
}
int setgolf (golf & g)
{
    if(g.fullname[0]=='\0' || g.fullname[0]==' ' || g.fullname[0]=='\n')
        return 0;
    else return 1;
}
 
int main()
{
    SetConsoleCP (1251);
    SetConsoleOutputCP (1251);
    golf golf_;
    setgolf(golf_, "Name", 12);
    cout<<"Имя: "<<golf_.fullname<<"\nГандикап: "<<golf_.handicap<<endl;
    cout<<"Возврат ф-ции int setgolf (golf & g): "<<setgolf(golf_)<<endl;
    system("pause");
    return 0;
}
alsav22
5417 / 4813 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
17.07.2012, 13:48 #15
Цитата Сообщение от Fooly Посмотреть сообщение
Строка 18. для "\0" и "\n" не удаётся установить для первого элемента, т.е нельзя написать g.fullname[0] - пишет несовместимые типы операндов const char * и char
C++
1
if(g.fullname[0]=='\0' || g.fullname[0]==' ' || g.fullname[0]=='\n')
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2012, 13:48
Привет! Вот еще темы с ответами:

Добавить выход из программы после ввода "0" - C++
Вот вобщем программа нормально компилируется и работает почти правильно. Мне нужно лишь чтоб при вводе 0, она отключалась. вкратце сама...

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

Считывание строки в случае выделения памяти динамически - C++
Здравствуйте! Подскажите, пожалуйста, я выделяю память динамически под строку, а потом пытаюсь считать строку с помощью функции...

Не прекращается ввод при вводе пустой строки - C++
Подскажите, пожалуйста, почему у меня не происходит прерывание цикла при вводе пустой строки вместо имени студента: #include...


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

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

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