Сомневайся с введением данных со стороны пользователя

Я начинаюсь в этом программирования в C ++ и должен говорить, что это один из небольшого количества языков программирования, который на самом деле мне понравился.

Сейчас я с темой введения данных со стороны пользователя, но я появляется сомнение, так как в сайтах я вижу, что они используют "cin >> " и в других они используют cin.getline().

В чем они различаются?

Который лучше?

1
задан 23.11.2016, 00:10
2 ответа

Внутри программирования, ориентируемого на объекты это обычно, что объекты приказали серией методов, чтобы они позволили работать с объектом. Это пример cin.getline.

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

int a = 5, b = 2;
int c = a + b; // correcto

struct test
{
  int valor;
};

struct test a,b;
a.valor = 5;
b.valor = 2;
struct test c = a + b; // ERROR, el compilador no sabe como aplicar este operando a una estructura

Поскольку мы сказали, в C ++ он возможный повторно определять поведение неких operandos, чтобы приспосабливать их к особенным объектам нашей программы. Так мы могли бы делать следующее:

struct test
{
  int valor;

  test& operator+(test& otro)
  {
    test toReturn;
    toReturn.valor = valor + otro.valor;
    return toReturn;
  }
};

struct test a, b;
a.valor = 3;
b.valor = 2;
struct c = a + b; // Correcto
std::cout << c.valor << '\n'; // Imprime 5

В той же линии, другие операторы, которые могут быть перегруженными, операторы вставления << и извлечение >>:

struct test
{
  int valor;

  test& operator+(test& otro)
  {
    test toReturn;
    toReturn.valor = valor + otro.valor;
    return toReturn;
  }

  friend std::ostream&& operator<<(std::ostream& out, test& dato);
  friend std::istream&& operator>>(std::istream& in, test& dato);
};

std::ostream&& operator<<(std::ostream& out, test& dato)
{
  return out << dato.valor;
}

std::istream&& operator>>(std::istream& in, test& dato)
{
  return out >> dato.valor;
}

struct a;
std::cin >> a; // Se recibirá un entero y se almacenará en a.valor;
std::cout << a; // Se imprimirá el valor almacenado en a.valor;

Я не буду входить в детали на использовании friend потому что это привело бы меня к тому, чтобы относиться к серии тем, которые превосходят область вопроса.

Конечно, перегружать операторы немного, когда делают только в очень особенных случаях, чтобы предотвращать неожиданное поведение ввиду detallitos глупцы языка как подразумеваемые превращения.

Как добавочная деталь, говорить, что операторы могут быть призванными, равно как любую другую функцию. Так мы можем делать следующее:

struct test a, b;
a.valor = 3;
b.valor = 2;
struct c = a.operator+(b); // Correcto
std::cout << c << '\n'; // Imprime 5

Итак, использование оператора >> он приходит определенный серией перегрузок вышеупомянутого оператора, в то время как cin.getline только функция член cin.

Конечно, во время решения, какой выбор использовать обращает большое внимание на детали каждой функции. Стандартный книжный магазин располагает небольшим количеством избыточных выборов. Это означает, что две функции могут функционировать равно только во внешнем виде.

Так, например, cin.getline прочитай цепь текста до тех пор, пока не находится разрыв линии (или недействительный характер), в то время как оператор >> он задерживается, найдя также место.

Если, например, из-за клавиатуры он пишет себе "Esto es una prueba":

  • cin.getline он вернет "Esto es una prueba"
  • cin >> var он вернет "Esto"

Это, не обладая тот факт, что оператор >> позволь возвращать целые числа, числа в плавающей запятой... в то время как cin.getline только позволь читать цепи текста.

2
ответ дан 24.11.2019, 12:27
  • 1
    Спасибо за ответ. Я пытался (потому что мне не нравится принимать вещи, не тестируя их. Глаз, я не сомневаюсь в твоем слове sinó что, если я это не тестирую, я это не задерживаю в памяти) и с командой cin > > меня возвращает целый string. А именно, если пользователь помещает " Привет я называюсь alberto" сделав cout < < nombrevariable у меня появляется весь string. –  Jogofus 23.11.2016, 00:32
  • 2
    @Jogofus std::string cad; std::cin >> cad; std::cout << "\n#" << cad << "#\n";. có я говорю предыдущий ты deberí чтобы печатать ú nicamente текст, который ты вводишь до первого места. Подушечки делают разы закладки, если ты имеешь má s có говорит в funció n. –  eferion 23.11.2016, 00:37

cin смоги "читать" (конвертировать, делать пробы в действительности) любой тип информации и сохранять это в переменной, взамен cin.getline только сохраняй strings (он ждет char* как параметр).

Чтобы показывать пример в каком случае ты использовал бы который:

#include <iostream>
using namespace std;

int main() {
  int numero;
  char cadena[11];

  cout << "Ingrese su edad: ";
  cin >> numero;
  cin.ignore(); // consumir Enter (\n)

  cout << "Ingrese su nombre: ";
  cin.getline(cadena, 10);

  cout << "Su nombre es: " << cadena << " Y su edad: " << numero;

  return 0;
}
0
ответ дан 24.11.2019, 12:27