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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 203, средняя оценка - 4.94
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
#1

string И getline - C++

12.04.2010, 16:51. Просмотров 28893. Ответов 6
Метки нет (Все метки)

C++
1
2
3
4
string name;
cout <<"Name -> ";
getline(cin,name);
cout <<"OK, "<<name;
2 раза требует ввод почему?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2010, 16:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос string И getline (C++):

getline в string - C++
как сделать getline в string. ну чтобы считывало в string до нажатия enter с пробелами

Getline и string - C++
Надо как-то считать вводимый текст в строку полностью, до ввода энтера. Как оказалось getline со строкой работать нивкакую не хочет, даже...

string, getline() чтение строк - C++
Здравствуйте, помогите пожалуйста написать часть кода. Задача состоит в том, чтобы прочитать данные из строк, отдельные поля дат отделяются...

Не работает. cin.getline(string,200); - C++
Я создаю проект. Все работает кроме одного cin.getline(string,200), почему? Когда запускаю этот Task3 в отдельном проекте все есть, но...

getline, string, запись в файл, русский язык - C++
#include &lt;iostream&gt; using std::ios; using std::cin; using std::cout; using std::endl; #include &lt;string&gt; using std::string; ...

В string через getline() попадает предыдущий пробел - C++
Почему-то во втором и последующем объекте в переменной стринг пусто. Подозреваю, что туда передаётся нажатие клавиши Enter. #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
12.04.2010, 17:30 #2
А у меня требует один раз:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <string>
 
int main()
{
    std::string name;
    std::cout << "Name -> ";
    std::getline(std::cin,name);
    std::cout << "OK, " << name << std::endl;
    system("pause");
    return 0;
}
Может где-нибудь в другом месте ошибка?
1
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
12.04.2010, 19:39  [ТС] #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
string text,word;
int pos=0,i=0;
cout <<Rus("Ââåäèòå òåêñò\n");
getline(cin,text);
cout <<Rus("Ââåäèòå ñëîâî äëÿ ïîèñêГ*: ");
getline(cin,word);
while((pos = text.find(word,pos)) != NULL) {
i++;
pos+=word.size();
}
 
 
cout <<i<<endl;
 
}
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
13.04.2010, 04:20 #4
Цитата Сообщение от Krist_ALL Посмотреть сообщение
2 раза требует ввод почему?
Опять-таки не вижу, где эта ошибка.

У тебя другая ошибка - индекс, полученный с помощью функции find(), нужно сравнивать не с NULL (что вообще-то означает 0, а подстрока может начинаться с нулевого индекса), а с npos (беззнаковое целое, инициализированное -1, которое означает "не найдено" для результата функции find()):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
 
int main()
{
    setlocale(LC_ALL, "Russian");
    std::string text, word;
    size_t pos=0, i=0;
    std::cout << "Введите текст: ";
    std::getline(std::cin, text);
    std::cout << "Введите слово для поиска: ";
    std::getline(std::cin, word);
    while((pos=text.find(word, pos))!=std::string::npos)
    {
        ++i;
        pos+=word.size();
    }
    std::cout << "Слово встретилось " << i << " раз(а)" << std::endl;
    system("pause");
    return 0;
}
2
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
13.04.2010, 13:41  [ТС] #5
что такое string::npos?
пробую вывести - выводиться длинное число..
и как по короче можно записать string::npos?
0
Nameless One
Эксперт С++
5773 / 3424 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
13.04.2010, 14:40 #6
Цитата Сообщение от Krist_ALL Посмотреть сообщение
что такое string::npos?
пробую вывести - выводиться длинное число.
Еще раз смотрим, что я написал выше:
Цитата Сообщение от Nameless One Посмотреть сообщение
беззнаковое целое, инициализированное -1, которое означает "не найдено" для результата функции find()
Так как npos - это константа, которая инициализируется отрицательным числом -1. Т.е npos - беззнаковое (неотрицательное) число, то вместо -1 в нем хранится максимальное число, которое может вместить тип size_t (4294967295). Это можно проверить, выполнив такую строчку, которая выведет true:

C++
1
std::cout << std::boolalpha << (std::string::npos == std::numeric_limits<size_t>::max()) << std::endl;
Теперь о том, как получилось такое число. Тип size_t на моей машине занимает 4 байта, т.е. 32 бит. В знаковых числах старший разряд (бит) - показатель знака. Отрицательные числа кодируются таким образом (пример для однобайтового типа, т.е. для 8 бит):
  1. Берется модуль отрицательного числа и расписывается его двоичное представление, с числом разрядов, равным числу бит типа, в котором хранится это число. Возьмем то же число -1. Его модуль для 8 разрядов в двоичной системе счисления равен 00000001
  2. Теперь инвертируем биты числа, т.е. в каждом разряде меняем 1 на 0 и наоборот: 11111110
  3. Прибавляем единицу: 11111111
  4. Получаем число, которое интерпретируется как -1, если рассматривать старший разряд (или бит) как знак числа, или 255, если рассматривать число как беззнаковое.
Для типа size_t (4 байта, 32 бит) двоичное представление числа -1 - это последовательность из 32 единиц. Если же рассматривать эту последовательность как беззнаковое число, то получаем 4294967295 - максимальное число, которое может хранится в типе size_t
Цитата Сообщение от Krist_ALL Посмотреть сообщение
и как по короче можно записать string::npos
Можно так:
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>
#include <string>
 
#define NPOS std::string::npos
 
int main()
{
    setlocale(LC_ALL, "Russian");
    std::string text, word;
    size_t pos=0, i=0;
    std::cout << "Введите текст: ";
    std::getline(std::cin, text);
    std::cout << "Введите слово для поиска: ";
    std::getline(std::cin, word);
    while((pos=text.find(word, pos))!=NPOS)
    {
        ++i;
        pos+=word.size();
    }
    std::cout << "Слово встретилось " << i << " раз(а)" << std::endl;
    system("pause");
    return 0;
}
Фууух...
2
Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
15.04.2010, 13:54  [ТС] #7
Я вместо npos написал -1))

нафиг было придумывать npos...
-1 и все!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2010, 13:54
Привет! Вот еще темы с ответами:

Отличие getline() от cin.getline() - C++
Чем отличается getline() от cin.getline() ?

Объясните разницу между "cin.getline" и "std::getline" - C++
string a; cin.getline(a); getline(cin, a);в чем разница между &quot;cin.getline(a);&quot; и &quot;getline(cin, a);&quot;

Доступ к паре в map<string, vector<pair<string, string>>>Temp - C++
Подскажите пожалуйста как получить данные в векторе пар ? void showData(const map&lt;string, vector&lt;pair&lt;string, string&gt;&gt;&gt;Temp) { ...

Getline си++ - C++
Подскажите пожалуйста, в чем причина неправильной работы кода? while(file.getline(name_file, 4, '=')) { ...


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

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

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