#include <string>
std::string input;
std::cin >> input;
O usuário deseja inserir "Hello World". Mas cin
falha no espaço entre as duas palavras. Como posso fazer o cin
take no todo Hello World
?
Na verdade, estou fazendo isso com estruturas e cin.getline
parece não funcionar. Aqui está o meu código:
struct cd
{
std::string CDTitle[50];
std::string Artist[50];
int number_of_songs[50];
};
std::cin.getline(library.number_of_songs[libNumber], 250);
Isso gera um erro. Alguma ideia?
library
de modo que é claro que é do tipocd
getline
entrar em umint
. Claro que falha.Respostas:
Você tem que usar
cin.getline()
:fonte
char
-buffers? É 2011.cin.getline(input, sizeof(input));
? Além disso, você não deve verificar o status de retorno?sizeof(input)
no lugar de 100 na chamada paracin.getline()
; isso significa que você pode alterar o tamanho do buffer de entrada e precisa alterar apenas uma linha em vez de duas linhas. A alteração 2 seria testar o retornocin.getline()
usando, por exemplo,if (!cin.getline(input, sizeof(input))) { ...handle EOF or error... }
ou algo semelhante, para lembrar ao OP que as operações de entrada, em particular, são vulneráveis a comportamentos inesperados. Outras respostas também precisam disso.Não "falha"; apenas para de ler. Ele vê um token lexical como uma "string".
Use
std::getline
:Observe que isso não é o mesmo que
std::istream::getline
, que funciona comchar
buffers de estilo C em vez destd::string
s.Atualizar
Sua pergunta editada tem pouca semelhança com o original.
Você estava tentando
getline
entrar em umint
buffer de seqüência de caracteres ou não. As operações de formatação de fluxos funcionam apenas comoperator<<
eoperator>>
. Use um deles (e ajuste de acordo para entrada de várias palavras) ou usegetline
e converta lexicamente paraint
depois do fato.fonte
getline
pode incluir a nova linha final na string que ele retorna. Em caso afirmativo, cabe a você excluí-lo.A Biblioteca padrão fornece uma função de entrada chamada
ws
, que consome espaço em branco de um fluxo de entrada. Você pode usá-lo assim:fonte
std::getline(std::cin, s)
eu ficaria muito confuso e diria que interrompeu a entrada ao esperar por entradas em um loopwhile
/for
. Esta opção resolveu meu problema!Usar :
a função pode ser encontrada em
fonte
cin.getline
não existe no seu sistema, você fez algo muito errado. Provavelmente você estava passando os argumentos errados. Melhor para não culpar os outros por seus erros ...Você deseja usar a função .getline em cin.
Tomou o exemplo daqui . Confira para mais informações e exemplos.
fonte
getline
. Está fora de moda. Emgetline
vez disso, use free , que pode ser usado comstd::string
. [BTW, cplusplus.com não é um recurso recomendado]O CAMINHO
Você pode usar a
gets
função encontrada no cstdio (stdio.h em c):A MANEIRA C ++
gets
é removido no c ++ 11.[Recomendado]: você pode usar getline (cin, nome) que está dentro
string.h
ou cin.getline (nome, 256), que é poriostream
si só.fonte
gets
é impossível usar com segurança. Foi até completamente removido no C11.Prefiro usar o seguinte método para obter a entrada:
Na verdade, é super fácil de usar, em vez de definir o comprimento total da matriz para uma string que contém um caractere de espaço.
fonte