#include <string>
std::string input;
std::cin >> input;
Пользователь хочет ввести «Hello World». Но cin
не получается пробел между двумя словами. Как я могу понять cin
все Hello World
?
Я действительно делаю это со структурами и cin.getline
, похоже, не работает. Вот мой код:
struct cd
{
std::string CDTitle[50];
std::string Artist[50];
int number_of_songs[50];
};
std::cin.getline(library.number_of_songs[libNumber], 250);
Это приводит к ошибке. Любые идеи?
library
чтобы было ясно, что она относится к типуcd
getline
вint
. Конечно, это не удается.Ответы:
Вы должны использовать
cin.getline()
:char input[100]; cin.getline(input,sizeof(input));
источник
char
-буферы? Это 2011.cin.getline(input, sizeof(input));
? Кроме того, не следует ли вам проверять статус возврата?sizeof(input)
вместо 100 при вызовеcin.getline()
; это означало бы, что вы можете изменить размер входного буфера, и вам нужно изменить только одну строку вместо двух. Изменение 2 будет заключаться в проверке возврата сcin.getline()
помощью, например,if (!cin.getline(input, sizeof(input))) { ...handle EOF or error... }
или чего-то подобного, чтобы напомнить OP, что операции ввода, в частности, уязвимы для неожиданного поведения. Это тоже нужно для других ответов.Он не «терпит неудачу»; он просто перестает читать. Он видит лексический токен как «строку».
Использование
std::getline
:int main() { std::string name, title; std::cout << "Enter your name: "; std::getline(std::cin, name); std::cout << "Enter your favourite movie: "; std::getline(std::cin, title); std::cout << name << "'s favourite movie is " << title; }
Обратите внимание, что это не то же самое
std::istream::getline
, что работает сchar
буферами C-стиля, а неstd::string
с.Обновить
Ваш отредактированный вопрос мало похож на оригинал.
Вы пытались
getline
войти вint
буфер, а не в строку или символьный буфер. Операции форматирования потоков работают только сoperator<<
иoperator>>
. Либо используйте один из них (и соответствующим образом настройте для ввода нескольких слов), либо используйтеgetline
и лексически преобразуйте егоint
в постфактум.источник
getline
может включать завершающую новую строку в строке, которую он возвращает. Если да, то вы должны удалить его.Стандартная библиотека предоставляет функцию ввода с именем
ws
, которая использует пробелы из входного потока. Вы можете использовать это так:std::string s; std::getline(std::cin >> std::ws, s);
источник
std::getline(std::cin, s)
я получал очень беспорядочный, и я бы сказал, прерывание ввода при ожидании ввода в циклеwhile
/for
. Эта опция решила мою проблему!Использование:
getline(cin, input);
функцию можно найти в
#include <string>
источник
cin.getline
его нет в вашей системе, значит, вы сделали что-то очень неправильно. Скорее всего, вы приводили неправильные аргументы. Лучше не обвинять других в своих ошибках ...Вы хотите использовать функцию .getline в cin.
#include <iostream> using namespace std; int main () { char name[256], title[256]; cout << "Enter your name: "; cin.getline (name,256); cout << "Enter your favourite movie: "; cin.getline (title,256); cout << name << "'s favourite movie is " << title; return 0; }
Взял пример отсюда . Проверьте это для получения дополнительной информации и примеров.
источник
getline
. Это устарело.getline
Вместо этого используйте бесплатный , который можно использовать сstd::string
. [Кстати, cplusplus.com не является рекомендуемым ресурсом]ПУТЬ C
Вы можете использовать
gets
функцию из cstdio (stdio.h в c):#include<cstdio> int main(){ char name[256]; gets(name); // for input puts(name);// for printing }
ПУТЬ С ++
gets
удален в c ++ 11.[Рекомендуется]: вы можете использовать getline (cin, name), который находится внутри,
string.h
или cin.getline (name, 256), который находитсяiostream
сам по себе.#include<iostream> #include<string> using namespace std; int main(){ char name1[256]; string name2; cin.getline(name1,256); // for input getline(cin,name2); // for input cout<<name1<<"\n"<<name2;// for printing }
источник
gets
безопасно пользоваться невозможно. Это даже было полностью удалено в C11.Я предпочитаю использовать следующий метод для ввода данных:
#include <iostream> #include <string> using namespace std; int main(void) { string name; cout << "Hello, Input your name please: "; getline(cin, name); return 0; }
На самом деле это очень просто использовать, а не определять общую длину массива для строки, содержащей символ пробела.
источник
Как прочитать строку из ввода?
Вы можете прочитать одно слово, завершенное пробелом,
std::cin
следующим образом:#include<iostream> #include<string> using namespace std; int main() { cout << "Please enter a word:\n"; string s; cin>>s; cout << "You entered " << s << '\n'; }
Обратите внимание, что нет явного управления памятью и буфера фиксированного размера, который может быть переполнен. Если вам действительно нужна целая строка (а не одно слово), вы можете сделать это:
#include<iostream> #include<string> using namespace std; int main() { cout << "Please enter a line:\n"; string s; getline(cin,s); cout << "You entered " << s << '\n'; }
источник