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

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

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

функция getline() в dev_C++ C++
C++ Функция getline в условии while
C++ Не работает функция getline !
Функция getline C++
Не выполняется функция getline() C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 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
 Аватар для Rififi
2330 / 1045 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
29.07.2009, 00:07     Функция С++ getline() #3
Golovastik,
функция насыщает переданный буфер символами до конца строки, но не более N-1 символов.
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
29.07.2009, 00:07     Функция С++ getline() #4
игнорирую пробелы, в отличии от cin >>
Это кто игнорирует пробелы ?
getline() пробелы не игнорирует.
Gravity
 Аватар для Gravity
556 / 550 / 39
Регистрация: 29.01.2009
Сообщений: 1,274
29.07.2009, 00:09     Функция С++ getline() #5
Цитата Сообщение от odip Посмотреть сообщение
Это кто игнорирует пробелы ?
getline() пробелы не игнорирует.
Граф, видимо, имел ввиду, что getline не прекращает считывать текст при встрече пробелов, в отличие от...
Golovastik
 Аватар для 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
 Аватар для Rififi
2330 / 1045 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
29.07.2009, 00:25     Функция С++ getline() #7
а ты можешь обьяснить полёт своей фантазии в строчках 10-11?
Golovastik
 Аватар для Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
29.07.2009, 00:26  [ТС]     Функция С++ getline() #8
Хотел увеличить количество,пока введённый символ не нулевой,если нулевой,тогда не увеличивать количество. Хочу чтоб результат выдавал количество символов,которе я введу.
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 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
 Аватар для Rififi
2330 / 1045 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
29.07.2009, 00:39     Функция С++ getline() #10
во-первых, ты совершил распространённую нубскую ошибку: ты не инициализировал буфер, оставив в нём мусор. к этому мы ещё вернёмся.
далее. выражение b[50] как несложно (надеюсь) догадаться - константа, которая не меняется на всём протяжении цикла while, поэтому кто и чего там будет считать - непонятно. кстати говоря для
Хотел увеличить количество,пока введённый символ не нулевой
есть стандартная функция strlen

теперь про буфер. ты зачем-то проверяешь самый последний символ этого буфера, не утчитывая тот факт, то ты можешь ввести меньшее количество символов. например ты ввёл 123, и тогда буфер будет выглядеть так:
'1', '2', '3', 0, <мусор до конца>
odip
Эксперт C++
 Аватар для odip
7225 / 3287 / 58
Регистрация: 17.06.2009
Сообщений: 14,165
29.07.2009, 10:00     Функция С++ getline() #11
теперь про буфер. ты зачем-то проверяешь самый последний символ этого буфера
Вообще говоря b[50] находится уже за концом буфера. В массиве b[] допустимые индексы от 0 до 49.
Rififi
 Аватар для Rififi
2330 / 1045 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
29.07.2009, 11:41     Функция С++ getline() #12
Вообще говоря b[50] находится уже за концом буфера.
Да, верно, thanx. Сглюканул на ночь глядя (:
Golovastik
 Аватар для 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
 Аватар для Monte-Cristo
2805 / 1370 / 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
 Аватар для 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
 Аватар для Monte-Cristo
2805 / 1370 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 00:08     Функция С++ getline() #16
Golovastik, можно. Но например, если тебе в процессе написания программы прийдеться изменить размер буеффера (строки b[50] ), то прийдеться изменять число 50 везде, где оно встречается. sizeof(b) возвращает размер этого буффера, и позволяет обойти редактирование всего листинга программы.
Golovastik
 Аватар для Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
30.07.2009, 00:12  [ТС]     Функция С++ getline() #17
Вроде ясно. Может не правильно сейчас спрошу. Скажите,каким образом можно изменить ввод более 50, используя сайзоф,если максимум 50 вначале инициализировано? Если можно напримере.
M128K145
Эксперт C++
 Аватар для M128K145
8272 / 3491 / 142
Регистрация: 03.07.2009
Сообщений: 10,707
30.07.2009, 00:20     Функция С++ getline() #18
Цитата Сообщение от Golovastik Посмотреть сообщение
Скажите,каким образом можно изменить ввод более 50, используя сайзоф,если максимум 50 вначале инициализировано? Если можно напримере.
В массив b ввести? Никак. Или изначально задавать максимально возможный размер массива. В теории при попытке записать более чем выделено под массив, то компилятор выдаст сообщение о попытке записи в недоступную область памяти
Golovastik
 Аватар для 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 и ifstream C++
Не работает функция getline(); C++
Функция cin.getline() C++

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

Или воспользуйтесь поиском по форуму:
Monte-Cristo
 Аватар для Monte-Cristo
2805 / 1370 / 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()
Ответ Создать тему

Метки
ввод/вывод c++
Опции темы

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