Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.59/224: Рейтинг темы: голосов - 224, средняя оценка - 4.59
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
#1

Функция С++ getline()

28.07.2009, 23:37. Просмотров 40353. Ответов 45

Здравствуйте! Скажите пожалуйста, каков смысл функции cin.getline(). Если не сложно,приведите пожалуйста пример.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2009, 23:37
Ответы с готовыми решениями:

Функция getline
Делаю упражнение по С++ (консольное приложение). Необходимо считать строку,...

Функция getline
Добрый вечер. Очень долго пытался найти в чём проблема в работе программы-она...

функция getline() в dev_C++
Помогите пожалуйста, не могу разобраться с функцией getline() Пишу на dev_C++...

Функция getline в условии while
Здравствуйте! Перевожу код с c++ на c#. Но возникла проблема с условием цикла...

Функция getline(cin,.)
Здравствуйте уважаемые программисты. По темам пробежался getline(), но чет не...

45
Monte-Cristo
2796 / 1382 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
28.07.2009, 23:40 #2
записывает в перменную n-е кол-во символов (игнорирую пробелы, в отличии от cin >> );

C++
1
2
3
char str[255];
cin.getline(str, sizeof(str));
cout << str << endl;
2
Rififi
2363 / 1056 / 104
Регистрация: 03.05.2009
Сообщений: 2,656
29.07.2009, 00:07 #3
Golovastik,
функция насыщает переданный буфер символами до конца строки, но не более N-1 символов.
2
odip
Эксперт С++
7161 / 3220 / 76
Регистрация: 17.06.2009
Сообщений: 14,161
29.07.2009, 00:07 #4
игнорирую пробелы, в отличии от cin >>
Это кто игнорирует пробелы ?
getline() пробелы не игнорирует.
2
Gravity
569 / 563 / 64
Регистрация: 29.01.2009
Сообщений: 1,274
29.07.2009, 00:09 #5
Цитата Сообщение от odip Посмотреть сообщение
Это кто игнорирует пробелы ?
getline() пробелы не игнорирует.
Граф, видимо, имел ввиду, что getline не прекращает считывать текст при встрече пробелов, в отличие от...
1
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
29.07.2009, 00:22  [ТС] #6
Попробывал сам наваять,но чего-то не вышло, не могу понять почему.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
int main()
{
    char b[50]; int k = 0;
    cout<<"Vvedite-> ";
    cin.getline(b,sizeof(b));
    while(b[50]!='\0')
        k++;
    cout<<"Rezylt = "<<b;
    cin.get();
}
0
Rififi
2363 / 1056 / 104
Регистрация: 03.05.2009
Сообщений: 2,656
29.07.2009, 00:25 #7
а ты можешь обьяснить полёт своей фантазии в строчках 10-11?
3
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
29.07.2009, 00:26  [ТС] #8
Хотел увеличить количество,пока введённый символ не нулевой,если нулевой,тогда не увеличивать количество. Хочу чтоб результат выдавал количество символов,которе я введу.
0
Monte-Cristo
2796 / 1382 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
29.07.2009, 00:38 #9
Golovastik, ну во первых есть функция strlen();

C++
1
cout << strlen(b);
если же использовать твой вариант, тогда необходимо делать так:

C++
1
2
        while(b[k]!='\0')
                k++;
у тебя же получалось, что вообще сравнивался НЕСУЩЕСТВУЮШЩИЙ символ с '\0'.

Индексация массива начинается с 0. Т.е. создаешь массив
C++
1
char str[5];
это значит что элменты у него:
str[0],str[1],str[2],str[3],str[4]

Не по теме:

p.s: 1900 пост :)

2
Rififi
2363 / 1056 / 104
Регистрация: 03.05.2009
Сообщений: 2,656
29.07.2009, 00:39 #10
во-первых, ты совершил распространённую нубскую ошибку: ты не инициализировал буфер, оставив в нём мусор. к этому мы ещё вернёмся.
далее. выражение b[50] как несложно (надеюсь) догадаться - константа, которая не меняется на всём протяжении цикла while, поэтому кто и чего там будет считать - непонятно. кстати говоря для
Хотел увеличить количество,пока введённый символ не нулевой
есть стандартная функция strlen

теперь про буфер. ты зачем-то проверяешь самый последний символ этого буфера, не утчитывая тот факт, то ты можешь ввести меньшее количество символов. например ты ввёл 123, и тогда буфер будет выглядеть так:
'1', '2', '3', 0, <мусор до конца>
0
odip
Эксперт С++
7161 / 3220 / 76
Регистрация: 17.06.2009
Сообщений: 14,161
29.07.2009, 10:00 #11
теперь про буфер. ты зачем-то проверяешь самый последний символ этого буфера
Вообще говоря b[50] находится уже за концом буфера. В массиве b[] допустимые индексы от 0 до 49.
0
Rififi
2363 / 1056 / 104
Регистрация: 03.05.2009
Сообщений: 2,656
29.07.2009, 11:41 #12
Вообще говоря b[50] находится уже за концом буфера.
Да, верно, thanx. Сглюканул на ночь глядя (:
0
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
29.07.2009, 23:23  [ТС] #13
Хорошо,если этот код написать так, по совету графа, это будет считаться коректным? Скажите,что именно нужно убрать в нём,чтоб код считался нормальным,как у всех?
Я изменил в одном месте.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;
 
int main()
{
        char b[50]; int k = 0;
        cout<<"Vvedite-> ";
        cin.getline(b,sizeof(b));
        while(b[k]!='\0')
                k++;
        cout<<"Rezylt = "<<k;
        cin.get();
}
0
Monte-Cristo
2796 / 1382 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
29.07.2009, 23:56 #14
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
int main()
{
        char b[50]; 
        int k = 0;
        cout << "Please, enter the string [below 50 symbols]: ";
        cin.getline(b,sizeof(b));
        k = strlen(b); // незачем изобретать велосипед
        cout << "Length of string is "<< k;
        system("pause"); // пауза для windows.. вместо cin.get();
        return 0; // функция main - типа int. Поэтому должна возвращать число ОСи. 0 -успешное завершение
}
1
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
30.07.2009, 00:04  [ТС] #15
Спасибо Граф! Вроде уяснил. Один момент, зачем писать в 8 строке
C++
1
 cin.getline(b,sizeof(b));
если можно
C++
1
 cin.getline(b,50); //чтоб длинным не была
0
Monte-Cristo
2796 / 1382 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 00:08 #16
Golovastik, можно. Но например, если тебе в процессе написания программы прийдеться изменить размер буеффера (строки b[50] ), то прийдеться изменять число 50 везде, где оно встречается. sizeof(b) возвращает размер этого буффера, и позволяет обойти редактирование всего листинга программы.
0
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
30.07.2009, 00:12  [ТС] #17
Вроде ясно. Может не правильно сейчас спрошу. Скажите,каким образом можно изменить ввод более 50, используя сайзоф,если максимум 50 вначале инициализировано? Если можно напримере.
0
M128K145
Эксперт JavaЭксперт С++
8324 / 3544 / 420
Регистрация: 03.07.2009
Сообщений: 10,708
30.07.2009, 00:20 #18
Цитата Сообщение от Golovastik Посмотреть сообщение
Скажите,каким образом можно изменить ввод более 50, используя сайзоф,если максимум 50 вначале инициализировано? Если можно напримере.
В массив b ввести? Никак. Или изначально задавать максимально возможный размер массива. В теории при попытке записать более чем выделено под массив, то компилятор выдаст сообщение о попытке записи в недоступную область памяти
0
Golovastik
11 / 11 / 2
Регистрация: 25.05.2009
Сообщений: 435
30.07.2009, 00:23  [ТС] #19
Код
 Но например, если тебе в процессе написания программы прийдеться изменить размер буеффера (строки b[50] )
Ну,а каким образом,если следовать по Монте Кристу?
0
Monte-Cristo
2796 / 1382 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 00:24 #20
Golovastik, я не понял вопрос... Я имел ввиду например следующий вариант:

Листинг

Например у тебя есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
int main()
{
        char z[50]; 
        int a = 0;
        int b = 0;
        cout << "Please, enter the string: ";
        cin.getline(z,50);
 
        for (int i=0; i<50; i++)
            if (z[i] == 'a' || z[i] == 'A') a++;
 
        for (int i=0; i<50; i++)
            if (z[i] == 'b' || z[i] == 'B') b++;
 
        cout << "Count of 'a' is "<< a << endl;
        cout << "Count of 'b' is "<< b << endl;
 
        system("pause"); 
        return 0;
}
например ты в процессе написания программы осознаешь, что 50 символов тебе мало, и хочешь изменить на 100. Для этого, тебе прийдется изменить размер при объявлении переменной, при считывании в нее, и при работе циклов.

Не по теме:

конечно здесь можно было подсчет символов а и б внести в один цикл, но я для наглядности использовал два.



а можно написать так, и изменить лишь размер при объявлении.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
int main()
{
        char z[50]; 
        int a = 0;
        int b = 0;
        cout << "Please, enter the string: ";
        cin.getline(z,sizeof(z));
 
        for (int i=0; i<sizeof(z); i++)
            if (z[i] == 'a' || z[i] == 'A') a++;
 
        for (int i=0; i<sizeof(z); i++)
            if (z[i] == 'b' || z[i] == 'B') b++;
 
        cout << "Count of 'a' is "<< a << endl;
        cout << "Count of 'b' is "<< b << endl;
 
        system("pause"); 
        return 0;
}
0
30.07.2009, 00:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2009, 00:24

Не работает функция getline !
Здравствуйте, помогите, если можете. Не корректно работает функция...

Функция cin.getline()
Имеется часть кода: void EditName(Account &amp;acc) { delete acc.name;...

Не работает функция getline();
Помогите, после ввода в переменную int c не выполняется функция getline,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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