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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 5.00
Fooly
 Аватар для Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
09.07.2012, 14:20     Выход в случае ввода пустой строки #1
Опять 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++
проблева ввода строки C++
Написать функцию которая бы выводила ошибки в случае неверного ввода числа C++
Считывание строки в случае выделения памяти динамически C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 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
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
09.07.2012, 14:37     Выход в случае ввода пустой строки #3
А что такое student, это тип string или собственный тип?
Fooly
 Аватар для 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
5282 / 4801 / 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
 Аватар для DiffEreD
1420 / 757 / 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
5282 / 4801 / 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
 Аватар для DiffEreD
1420 / 757 / 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
5282 / 4801 / 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
 Аватар для 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
5282 / 4801 / 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
157 / 138 / 11
Регистрация: 10.07.2012
Сообщений: 709
10.07.2012, 10:49     Выход в случае ввода пустой строки #12
Цитата Сообщение от Fooly Посмотреть сообщение
Программа работает отлично
спасибо, поржал...
я хотел этим сказать, что Ваша программа изобилует логическими ошибками... Вас стоит, быть может, призадуматься об этом...
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
 Аватар для DiffEreD
1420 / 757 / 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
5282 / 4801 / 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
28.09.2013, 17:39     Выход в случае ввода пустой строки
Еще ссылки по теме:

Длина строки до ввода ? C++
C++ Ввод пустой строки и ее запись в переменную
C++ Если в файле с новой строки есть 5 пробелов - заменить их на новый абзац, отделяющийся пустой строкой

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

Или воспользуйтесь поиском по форуму:
recoder
 Аватар для recoder
129 / 129 / 28
Регистрация: 13.09.2013
Сообщений: 260
Записей в блоге: 2
28.09.2013, 17:39     Выход в случае ввода пустой строки #16
Вот что получилось вообще:


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
75
76
77
78
79
80
81
82
83
84
85
86
87
#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);
void display1(student st);
void display2(const student *ps);
void display3(const student pa [], int n);
 
 
int main()
{
    cout << "Enter class size: ";
    int class_size;
    cin >> class_size;
    while (cin.get() != '\n')
        continue;
    student * ptr_stu = new student[class_size];
    int entered = getinfo(ptr_stu, class_size);
    for (int i = 0; i < entered; i++)
    {
        cout << "Struct one: " << endl;
        display1(ptr_stu[i]);
        cout << endl;
        cout << "Struct two: " << endl;
        display2(&ptr_stu[i]);
        cout << endl;
    }
    cout << endl;
    cout << "Struct three: " << endl;
    display3(ptr_stu, entered);
    delete [] ptr_stu;
    cout << "Done\n";
    return 0;
}
 
int getinfo(student pa [], int n)
{
    int size = 0;
    for (int i = 0; i < n; i++)
    {
        cout << "Enter your name: ";
        if (!(cin.get(pa[i].fullname, SLEN)))
        {
            return size;
        }
        while (cin.get() != '\n')
            continue;
        cout << "Enter your hobby: ";
        cin >> pa[i].hobby;
        cout << "Enter your skills (1-4): ";
        cin >> pa[i].ooplevel;
        size++;
        cin.get();
    }
    return size;
}
 
void display1(student st)
{
    cout << "Name: " << st.fullname << endl;
    cout << "Hobby: " << st.hobby << endl;
    cout << "Skill: " << st.ooplevel << endl;
}
 
void display2(const student *ps)
{
    cout << "Name: " << ps->fullname << endl;
    cout << "Hobby: " << ps->hobby << endl;
    cout << "Skill: " << ps->ooplevel << endl;
}
 
void display3(const student pa [], int n)
{
    for (int i = 0; i < n; i++){
        cout << "Name: " << pa[i].fullname << endl;
        cout << "Hobby: " << pa[i].hobby << endl;
        cout << "Skill: " << pa[i].ooplevel << endl;
    }
}
Yandex
Объявления
28.09.2013, 17:39     Выход в случае ввода пустой строки
Ответ Создать тему
Опции темы

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