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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 307, средняя оценка - 4.87
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
#1

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

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

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

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

Функция getline - C++
Делаю упражнение по С++ (консольное приложение). Необходимо считать строку, включая пробелы. Вот описание класса: class employee { ...

Не работает функция getline(); - C++
Помогите, после ввода в переменную int c не выполняется функция getline, программа ее просто пропускает. #include <iostream> using...

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

Не работает функция getline ! - C++
Здравствуйте, помогите, если можете. Не корректно работает функция getline ! Я облазил google, нашел много похожих постов, но...

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

Функция cin.getline() - C++
Имеется часть кода: void EditName(Account &acc) { delete acc.name; char nam; cout<<"Введите новое имя: "; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
28.07.2009, 23:40     Функция С++ getline() #2
записывает в перменную n-е кол-во символов (игнорирую пробелы, в отличии от cin >> );

C++
1
2
3
char str[255];
cin.getline(str, sizeof(str));
cout << str << endl;
Rififi
2338 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
29.07.2009, 00:07     Функция С++ getline() #3
Golovastik,
функция насыщает переданный буфер символами до конца строки, но не более N-1 символов.
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
29.07.2009, 00:07     Функция С++ getline() #4
игнорирую пробелы, в отличии от cin >>
Это кто игнорирует пробелы ?
getline() пробелы не игнорирует.
Gravity
562 / 556 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
29.07.2009, 00:09     Функция С++ getline() #5
Цитата Сообщение от odip Посмотреть сообщение
Это кто игнорирует пробелы ?
getline() пробелы не игнорирует.
Граф, видимо, имел ввиду, что getline не прекращает считывать текст при встрече пробелов, в отличие от...
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
29.07.2009, 00:22  [ТС]     Функция С++ getline() #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();
}
Rififi
2338 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
29.07.2009, 00:25     Функция С++ getline() #7
а ты можешь обьяснить полёт своей фантазии в строчках 10-11?
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
29.07.2009, 00:26  [ТС]     Функция С++ getline() #8
Хотел увеличить количество,пока введённый символ не нулевой,если нулевой,тогда не увеличивать количество. Хочу чтоб результат выдавал количество символов,которе я введу.
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
29.07.2009, 00:38     Функция С++ getline() #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 пост

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

теперь про буфер. ты зачем-то проверяешь самый последний символ этого буфера, не утчитывая тот факт, то ты можешь ввести меньшее количество символов. например ты ввёл 123, и тогда буфер будет выглядеть так:
'1', '2', '3', 0, <мусор до конца>
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
29.07.2009, 10:00     Функция С++ getline() #11
теперь про буфер. ты зачем-то проверяешь самый последний символ этого буфера
Вообще говоря b[50] находится уже за концом буфера. В массиве b[] допустимые индексы от 0 до 49.
Rififi
2338 / 1053 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
29.07.2009, 11:41     Функция С++ getline() #12
Вообще говоря b[50] находится уже за концом буфера.
Да, верно, thanx. Сглюканул на ночь глядя (:
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
29.07.2009, 23:23  [ТС]     Функция С++ getline() #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();
}
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
29.07.2009, 23:56     Функция С++ getline() #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 -успешное завершение
}
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
30.07.2009, 00:04  [ТС]     Функция С++ getline() #15
Спасибо Граф! Вроде уяснил. Один момент, зачем писать в 8 строке
C++
1
 cin.getline(b,sizeof(b));
если можно
C++
1
 cin.getline(b,50); //чтоб длинным не была
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 00:08     Функция С++ getline() #16
Golovastik, можно. Но например, если тебе в процессе написания программы прийдеться изменить размер буеффера (строки b[50] ), то прийдеться изменять число 50 везде, где оно встречается. sizeof(b) возвращает размер этого буффера, и позволяет обойти редактирование всего листинга программы.
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
30.07.2009, 00:12  [ТС]     Функция С++ getline() #17
Вроде ясно. Может не правильно сейчас спрошу. Скажите,каким образом можно изменить ввод более 50, используя сайзоф,если максимум 50 вначале инициализировано? Если можно напримере.
M128K145
Эксперт С++
8283 / 3502 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
30.07.2009, 00:20     Функция С++ getline() #18
Цитата Сообщение от Golovastik Посмотреть сообщение
Скажите,каким образом можно изменить ввод более 50, используя сайзоф,если максимум 50 вначале инициализировано? Если можно напримере.
В массив b ввести? Никак. Или изначально задавать максимально возможный размер массива. В теории при попытке записать более чем выделено под массив, то компилятор выдаст сообщение о попытке записи в недоступную область памяти
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
30.07.2009, 00:23  [ТС]     Функция С++ getline() #19
Код
 Но например, если тебе в процессе написания программы прийдеться изменить размер буеффера (строки b[50] )
Ну,а каким образом,если следовать по Монте Кристу?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2009, 00:24     Функция С++ getline()
Еще ссылки по теме:

Функция getline в условии while - C++
Здравствуйте! Перевожу код с c++ на c#. Но возникла проблема с условием цикла while while(getline(cin,S)) {...} Почитал в...

Не выполняется функция getline() - C++
Добрый вечер, уважаемые программисты! Написал программу, содержащую класс, который имеет два поля: номер и имя, и два метода: ввод и...

Функция getline и ifstream - C++
int main() { int i,c; char filename; char input_line; cout&lt;&lt;&quot;Enter a file name and press ENTER: &quot;; cin.getline(filename,80);...

Функция getline(cin,slovo) - C++
Программисты! Подскажите, если не трудно, в строке: getline(cin, slovo); Какую роль играет cin ? slovo - это...

Почему не работает функция getline ()? - C++
Может что-то нужно дописывать? #include &lt;iostream&gt; using namespace std; int main() {


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

Или воспользуйтесь поиском по форуму:
Monte-Cristo
2787 / 1373 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 00:24     Функция С++ getline() #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;
}
Yandex
Объявления
30.07.2009, 00:24     Функция С++ getline()
Ответ Создать тему
Опции темы

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