Подтвердить что ты не робот

Почему существуют две разные функции getline() (если они есть)?

Каждый раз, когда я делаю быстрый фрагмент строки кода С++

std::string s;
cin >> s;

Я проклинаю себя, потому что забыл, что он останавливается в пробеле, а не получает целую строку.

Тогда, вспомнив getline, я неизменно путаюсь в отношении двух многообразий:

std::string s;
getline (std::cin, s);

и

char cs[256];
std::cin.getline (cs, sizeof (cs));

Есть ли разница между этими двумя, кроме типа данных?

Мне кажется, что С++ должен быть первым. При каких обстоятельствах я буду использовать последнее, учитывая, что я, вероятно, должен использовать реальные строки вместо всех массивов символов с нулевым символом?

И, поскольку вход должен действительно быть полем входных потоков, почему не первая часть istream?

4b9b3361

Ответ 1

Имейте в виду, что стандартная библиотека состоит из 3 (основных) частей: IOStream, String и STL, плюс некоторые брошенные в лакомствах и C-заголовках.

Я не вижу ничего странного в том, что эти части слабо связаны (хотя мне жаль, что это не так).

Другие несоответствия включают: std::string::length vs std::string::size, последний был добавлен для совместимости интерфейса с STL, а первый был сохранен для совместимости со старым кодом.

Ответ 2

Глобальная функция getline() работает с С++ std::string.

istream:: getline() работают с "классическими" строками C (указатели на char).

Ответ 3

Это общая проблема с интерфейсом. cin.getline() - естественный способ сделать запрос, но чтобы избежать изменения кода потока в <string>, функция cin.getline(std::string&) может быть предложена. Свободностоящий getline(cin, s) может быть добавлен позже, если строки введены в объем. Не проблема для char*, так как там ничего нет #include - вся эта часть языка.

В некотором смысле, хорошо, когда языки позволяют более позднему коду добавлять дополнительные функции к существующим классам (например, Ruby), но другими способами делокализация укусов и, что ж, компрометирует ремонтопригодность. Тогда, конечно, есть популярный аргумент для минимальных функций-членов и множество самостоятельных функций: я лично считаю, что это не следует воспринимать настолько, чтобы сделать интерфейс менее интуитивным и выразительным, но каждый к своему.

Ответ 4

Вариант getline внутри библиотеки iostreams не поддерживает строки в качестве целей, поэтому библиотека строк определяет вариант, который делает.

Ответ 5

Да, современный С++ способ - использовать свободную функцию и ввести std::string.

Но IOStream имеет гораздо более длинную историю (стандартная версия - это, по крайней мере, третье воплощение одного и того же дизайна), чем std::string, и эта история объясняет, почему все так, как они есть.

(Элемент getline имеет то преимущество, что он не подразумевает динамическое распределение, эта характеристика может быть удобной во времени, но, вероятно, не будет достаточной, чтобы оправдать ее в дизайне с нуля).