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

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

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

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

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

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

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

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

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

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

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

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

45
Monte-Cristo
2789 / 1375 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 00:08 #16
Golovastik, можно. Но например, если тебе в процессе написания программы прийдеться изменить размер буеффера (строки b[50] ), то прийдеться изменять число 50 везде, где оно встречается. sizeof(b) возвращает размер этого буффера, и позволяет обойти редактирование всего листинга программы.
0
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
30.07.2009, 00:12  [ТС] #17
Вроде ясно. Может не правильно сейчас спрошу. Скажите,каким образом можно изменить ввод более 50, используя сайзоф,если максимум 50 вначале инициализировано? Если можно напримере.
0
M128K145
Эксперт С++
8289 / 3509 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
30.07.2009, 00:20 #18
Цитата Сообщение от Golovastik Посмотреть сообщение
Скажите,каким образом можно изменить ввод более 50, используя сайзоф,если максимум 50 вначале инициализировано? Если можно напримере.
В массив b ввести? Никак. Или изначально задавать максимально возможный размер массива. В теории при попытке записать более чем выделено под массив, то компилятор выдаст сообщение о попытке записи в недоступную область памяти
0
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
30.07.2009, 00:23  [ТС] #19
Код
 Но например, если тебе в процессе написания программы прийдеться изменить размер буеффера (строки b[50] )
Ну,а каким образом,если следовать по Монте Кристу?
0
Monte-Cristo
2789 / 1375 / 30
Регистрация: 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
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
30.07.2009, 00:30  [ТС] #21
Тоесть изменение можно сделать в одном из циклов, написав,чтоб считало до sizeof(z), и получается,что начальная инициализация в 50 символов будет проигнорированна?
0
ISergey
Maniac
Эксперт С++
1375 / 886 / 52
Регистрация: 02.01.2009
Сообщений: 2,661
Записей в блоге: 1
30.07.2009, 00:35 #22
Цитата Сообщение от Monte-Cristo Посмотреть сообщение
а можно написать так, и изменить лишь размер при объявлении.
можно использовать std::string и не морочить себе голову.
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <string>
 
int main() {
 
    std::string str;
    std::getline(std::cin, str);
    std::cout << str << '\n';
 
    return 0;
}
0
Monte-Cristo
2789 / 1375 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 00:40 #23
Цитата Сообщение от ISergey Посмотреть сообщение
можно использовать std::string и не морочить себе голову


Добавлено через 1 минуту 29 секунд
но есть одно... у меня в крови системный программсит сидит... а он знаешь из какого народа? все ж не так... все ж самому писать.. дабы получить максимум из проивзодительности...

Добавлено через 2 минуты 37 секунд
Цитата Сообщение от Golovastik Посмотреть сообщение
Тоесть изменение можно сделать в одном из циклов, написав,чтоб считало до sizeof(z), и получается,что начальная инициализация в 50 символов будет проигнорированна?
нет. это значит что в листинге поправить одну циферку нада, а не 10 циферок (при коде в 1000 строк) отыскивать 10 циферок сложновато.
0
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
30.07.2009, 00:44  [ТС] #24
Извиняюсь что перебил,я по поводу кода:
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;
}
Почему,какой-т остранный вывод?
Вот фото:
Что такое 3 и что такое 1?
0
Миниатюры
Функция С++ getline()  
Monte-Cristo
2789 / 1375 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 00:53 #25
Цитата Сообщение от ISergey Посмотреть сообщение
И минимум переносимости кода.
ну это извечный баг системщика)

Не по теме:

p.s: чтоб Шумахер таки учавствовал в следующем гран-при!



Добавлено через 3 минуты 1 секунду
Цитата Сообщение от Golovastik Посмотреть сообщение
Почему,какой-т остранный вывод?
Вот фото:
Что такое 3 и что такое 1?
попробуй так (возможно муссор поподает):
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] = {'\0'}; 
    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
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
30.07.2009, 00:58  [ТС] #26
Та ну,вообще нули пошли. А по поводу чтоб неморочить голову, попробывал вот так, но не выходит.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
      string b;
      cout<<"Vvedite chelovek -> ";
      cin.getline(b,string);
      cout<<b;
 
cin.get();
}
0
Monte-Cristo
2789 / 1375 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 01:02 #27
Golovastik, ты какой компилятор используешь?

Добавлено через 1 минуту 9 секунд
gcc и vcc нормально компилируют.
0
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
30.07.2009, 01:03  [ТС] #28
Студию 2005, ответьте пожалуйста на 2 часть вопроса.
0
Monte-Cristo
2789 / 1375 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
30.07.2009, 01:10 #29
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
 
int main() 
{
    string str;
    cout << "Please, enter the string:" << endl;
    getline(std::cin, str);
    cout << str << '\n';
    system("pause");
    return 0;
}
0
Golovastik
11 / 11 / 0
Регистрация: 25.05.2009
Сообщений: 435
30.07.2009, 01:17  [ТС] #30
Выводит то,что ввёл, а не количество символов.
Скажите,а чтоб не использовать getline(std::cin, str);
Я имею ввиду, std:: ,можно как-то написать юзинг намеспасе стд,чтоб не вводить постоянно стд.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2009, 01:17
Привет! Вот еще темы с ответами:

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

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

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

Функция 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);...


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

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

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