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

string И getline - C++

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

C++ Getline и string
getline в string C++
string, getline() чтение строк C++
getline C++
C++ getline, string, запись в файл, русский язык
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
12.04.2010, 17:30     string И getline #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;
}
Может где-нибудь в другом месте ошибка?
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
12.04.2010, 19:39  [ТС]     string И getline #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;
 
}
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.04.2010, 04:20     string И getline #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;
}
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
13.04.2010, 13:41  [ТС]     string И getline #5
что такое string::npos?
пробую вывести - выводиться длинное число..
и как по короче можно записать string::npos?
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
13.04.2010, 14:40     string И getline #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;
}
Фууух...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.04.2010, 13:54     string И getline
Еще ссылки по теме:

Не работает. cin.getline(string,200); C++
В string через getline() попадает предыдущий пробел C++
Отличие getline() от cin.getline() C++

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

Или воспользуйтесь поиском по форуму:
Krist_ALL
 Аватар для Krist_ALL
9 / 9 / 0
Регистрация: 01.02.2010
Сообщений: 317
15.04.2010, 13:54  [ТС]     string И getline #7
Я вместо npos написал -1))

нафиг было придумывать npos...
-1 и все!
Yandex
Объявления
15.04.2010, 13:54     string И getline
Ответ Создать тему
Опции темы

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