эквивалент Console.ReadLine() в С++

screenshotМой учитель только что дал мне задание на С++, и я пытаюсь получить строку с помощью scanf, но получается только последние введенные символы. Кто-нибудь может мне помочь? Я ищу эквивалент console.readline() в С++.

редактировать: я также должен иметь возможность хранить значение через указатель.

поэтому на картинке показан код, который в настоящее время выполняется в фоновом режиме, и он должен был остановиться на болезни «Нет гарантии»: и ждал ввода, но пропустил его.

getline(cin, prav->нам); работает, но почему-то пропускает строку...


person AntoineLev    schedule 09.10.2012    source источник
comment
в C/C++ =› fgets, в C++ =› std::getline   -  person rubber boots    schedule 09.10.2012
comment
Не используйте скриншоты кода, создайте образец, который включает только соответствующий код и опишите ваш ввод в него, а также желаемый и фактический результат. По сути, поработайте над изоляцией/диагностикой вашей проблемы, прежде чем публиковать вопрос, кроме того, что у меня есть это, и он не работает.   -  person millimoose    schedule 09.10.2012


Ответы (2)


Вы ищете std::getline(). Например:

#include <string>
std::string str;
std::getline(std::cin, str);

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

Обновление: Глядя на ваш обновленный вопрос, я могу себе представить, что происходит. Код, который читает выбор, то есть число 1, 2 и т. д., не читает новую строку. Затем вы вызываете getline, который использует новую строку. И затем вы снова вызываете getline, который извлекает строку.

person David Heffernan    schedule 09.10.2012
comment
Да, мне кажется, scanf() читает слова как строки. fgets(..., stdin) также может работать. - person ; 09.10.2012
comment
Это функции Си. Это касается струн C. Строки C++ — это то, что нам здесь нужно. - person David Heffernan; 09.10.2012
comment
строка с scanf я читаю как char *foo; не std::string foo; Я предполагаю, что указатель также означает строку в стиле C с нулевым завершением. - person ; 09.10.2012
comment
@ user1732694 : Что этот вопрос означает? - person ildjarn; 09.10.2012
comment
Вы должны быть точны. Вы сказали, что вам нужен C++ эквивалент Console.ReadLine(). Аналогом строки C# является C++ std::string (при условии кодирования). Какой тип данных вы хотите использовать? Если вы хотите использовать строки C (строки с завершающим нулем), то, скорее всего, вы программируете на C, а не на C++. - person David Heffernan; 09.10.2012
comment
что я хочу сделать, так это взять строку, введенную пользователем в консольной программе на С++, и передать ее в эту переменную: &ptrav-›nam ptrav — указатель на структуру, а nam — строка в структуре. - person AntoineLev; 09.10.2012
comment
Хорошо, вы можете сделать это: getline(cin, ptrav->nam). Это потому, что строковый параметр передается по ссылке на getline. - person David Heffernan; 09.10.2012
comment
не получаю никакой ошибки, но кажется, что она проходит через нее и мгновенно переходит к следующей строке, мне нужно поставить паузу или что-то в этом роде? - person AntoineLev; 09.10.2012
comment
Скриншоты не позволяют нам запускать ваш код. Создайте наименьшую возможную программу, иллюстрирующую вашу проблему, и опубликуйте ее. Я думаю, это будет новый вопрос. Я думаю, что вопрос, который вы задали здесь, был дан ответ. - person David Heffernan; 09.10.2012
comment
Похоже, что getline() не принимает ввод, пока не будет введен символ, отличный от пробела. Это едва ли то же самое, что и Console.ReadLine(). - person Jonathan Wood; 19.03.2017
comment
#include "string" необходимо добавить, иначе вы можете получить identifier "getline" is undefined - person Junior Mayhé; 22.07.2017

Согласно MSDN, Console::ReadLine:

Reads the next line of characters from the standard input stream.

Вариант С++ (без указателей):

#include <iostream>
#include <string>

 int main()
{
 std::cout << "Enter string:" << flush;
 std::string s;
 std::getline(std::cin, s);
 std::cout << "the string was: " << s << std::endl;
}


Вариант C (с буферами и указателями) также работает с компиляторами C++, но его не следует использовать:

 #include <stdio.h>
 #define BUFLEN 256

 int main()
{
 char buffer[BUFLEN];   /* the string is stored through pointer to this buffer */
 printf("Enter string:");
 fflush(stdout);
 fgets(buffer, BUFLEN, stdin); /* buffer is sent as a pointer to fgets */
 printf( "the string was: %s", buffer);
}


Согласно вашему примеру кода, если у вас есть структура patient (исправлено после замечания Дэвида Хеффермана):

struct patient {
   std::string nam, nom, prenom, adresse;
};

Затем должно работать следующее (добавлено ios::ignore после того, как дополнительная проблема была решена Дэвидом Хеффернаном логическим мышлением). Пожалуйста, НЕ используйте scanf в своем коде ВООБЩЕ.

...
std::cin.ignore(256); // clear the input buffer

patient *ptrav = new patient;

std::cout << "No assurance maladie : " << std::flush;
std::getline(std::cin, ptrav->nam);
std::cout << "Nom : " << std::flush;
std::getline(std::cin, ptrav->nom);
std::cout << "Prenom : " << std::flush;
std::getline(std::cin, ptrav->prenom);
std::cout << "Adresse : " << std::flush;
std::getline(std::cin, ptrav->adresse);
...
person rubber boots    schedule 09.10.2012