공백이있는 std :: cin 입력?


144
#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);

오류가 발생합니다. 어떤 아이디어?


27
새로운 질문을하기 위해 질문을 편집해서는 안됩니다. 그 이유는 사람들이 이미 귀하의 원래 질문에 대한 답변을했으며 지금은 그 답변이 상황에 맞지 않는 것 같습니다. 원래 질문에 이미 답변 한 경우 혼란을 피하기 위해 새 질문을 시작하십시오.
Pete

약간의 검토를 거친 것이 분명하지만 변수에 대한 선언을 추가하여 다음 library과 같은 유형임을 알 수 있습니다.cd
chandsie

죄송합니다,이게 서두르고 다시 게시하겠습니다.
레몬

1
교체를 통해 다시 게시하려는 경우 mod에 의해 삭제 질문을 표시하십시오.
궤도에서 가벼움 레이스

2
업데이트에서에을 (를) 시도 getline하고 int있습니다. 물론 실패합니다.
벤 Voigt

답변:


102

당신은 사용해야합니다 cin.getline():

char input[100];
cin.getline(input,sizeof(input));

7
@ 케빈 Meh, 일어난다. C ++은 우리가 원하는만큼 직관적이지 않습니다.
Pete

62
;; 왜 char버퍼를 사용 합니까? 2011 년입니다.
궤도에서 가벼움 경주

3
왜 사용하지 cin.getline(input, sizeof(input));않습니까? 또한 반품 상태를 확인해서는 안됩니까?
Jonathan Leffler 2016 년

2
@JonathanLeffler이 글을 쓸 당시에는 이것이 원래 질문 된 질문에 대한 답변이었습니다 (실제 질문에 대한 첫 번째 주석을 보면 OP의 편집으로 인해 컨텍스트가 변경되었음을 알 수 있습니다). 어느 쪽이든, 당신이 그 답이 끔찍하다고 느끼면 그것을 공감하십시오. 나는 이것이 "최고의"해결책은 아니지만 그 해결책이라는 것을 인정한다. 내가 왜 무언가를 사용하지 않았는지 묻는 대신, 우리가 왜 그렇게해야하는지 모든 것을 말할 수 있습니다.
Pete

7
당신의 대답은 끔찍하지 않으며 하향 투표가 필요하지 않습니다. 나는 두 가지 작은 변화가 그것을 향상시킬 것이라고 생각합니다. 변경 1은 다음 sizeof(input)에 대한 호출에서 100 대신 사용 됩니다 cin.getline(). 즉, 입력 버퍼의 크기를 변경할 수 있으며 두 줄 대신 한 줄만 변경하면됩니다. 변경 2는 입력 작업, 특히 예기치 않은 동작에 취약하다는 OP를 상기시키기 cin.getline()위해 예를 들어 if (!cin.getline(input, sizeof(input))) { ...handle EOF or error... }또는 이와 유사한 것을 사용하여 리턴을 테스트하는 것이다 . 다른 답변도 필요합니다.
Jonathan Leffler 2016 년

215

"실패"하지 않습니다. 그냥 읽지 않습니다. 어휘 토큰을 "문자열"로 간주합니다.

사용 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::getlineC 스타일로 작동 char버퍼가 아니라 std::string의.

최신 정보

편집 한 질문은 원본과 거의 유사하지 않습니다.

문자열이나 문자 버퍼가 아닌 에 getline들어 가려고했습니다 int. 스트림의 형식화 작업은 operator<<및 로만 작동 operator>>합니다. 그중 하나를 사용하고 (다중 단어 입력에 따라 적절히 조정), 사용 getline하고 어휘 적으로 int사후에 변환합니다 .


2
문자 길이를 지정할 필요가 없기 때문에이 대답이 허용되는 것보다 훨씬 좋습니다.
TheWanderer

1
@ TheWanderer 실제로, 그것은 큰 이점입니다.
궤도에서 가벼움

sstream을 포함해야합니다 : #include <sstream>
GilbertS

@LightnessRacesinOrbit, 도와주세요? 출력물을 인쇄하는 동안 아무런 이유없이 추가 줄 바꿈을 제공합니다.
Anshuman Kumar

@AnshumanKumar getline반환하는 문자열에 종료 줄 바꿈이 포함될 수 있습니다. 그렇다면 삭제하는 것은 귀하의 책임입니다.
마크 랜섬

31

표준 라이브러리는 ws입력 스트림에서 공백을 소비 하는 입력 함수를 제공 합니다. 다음과 같이 사용할 수 있습니다.

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

4
나는 이것이 지금까지 가장 좋은 대답이라고 생각합니다. 위의 std :: cin >>과 함께 사용할 수 있습니다.
Andra

1
지금까지 가장 좋은 답변입니다. 사용할 때 std::getline(std::cin, s)나는 매우 지저분해질 것이고 while/ for루프 에서 입력을 기다릴 때 입력이 중단되었다고 말할 것 입니다. 이 옵션은 내 문제를 해결했습니다!
omerowitz

sstream 포함 : #include <sstream>
GilbertS

24

사용하다 :

getline(cin, input);

이 기능은

#include <string>

2
+1 이것은 실제로 나를 위해 일한 유일한 대답입니다. 나머지 답변은 cin.getline ()을 사용한다고 말하지만 함수가 존재하지 않는다는 오류가 발생했습니다.
blembo

7
@blembo : 정말요? 이 답변 전에 3 년 이상을 게시 한 내 대답은 똑같은 것을 말합니다 (귀하의 주장과 반대).
궤도에서 가벼움 레이스

@ blembo : cin.getline시스템에 존재하지 않으면 매우 잘못한 것입니다. 아마도 당신은 잘못된 주장을 전달했을 것입니다. 실수에 대해 다른 사람을 비난하지 않는 것이 가장
좋습니다

13

cin에서 .getline 함수를 사용하려고합니다.

#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;
}

여기 에서 예를 들었습니다 . 자세한 정보와 예제를 확인하십시오.


12
사실, member-를 거의 사용하지 않으려 고합니다 getline. 구식입니다. getline대신 무료로 사용하십시오 std::string. [BTW, cplusplus.com은 권장 리소스 가 아닙니다 .]
Lightness Races Orbit

1
@Tomalak 왜 cplusplus.com이 권장되지 않습니까? 나는 항상 그것을 사용 : P
레몬

6
@KevinDuke : 튜토리얼이 잘못되어 정확하지 않을 수 있으며 참조에 많은 오류가 있습니다. 이것들 은 좋은 자료입니다.
궤도에서 가벼움 레이스

1
@NickSweeting : 네; 사용 대신.
궤도에서 가벼움 경주

1
설명서 링크의 경우 cppreference.com은 cplusplus.com을 효과적으로 대체합니다 (둘 다 비공식적 인 역구)
Ben Voigt

4

C 웨이

getscstdio (stdio.h in c)에있는 함수 를 사용할 수 있습니다 .

#include<cstdio>
int main(){

char name[256];
gets(name); // for input
puts(name);// for printing 
}

C ++ 방법

gets c ++ 11에서 제거되었습니다.

[권장] : 당신은 사용할 수 의 getline (CIN, 이름)string.h 또는 cin.getline (이름, 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
}

10
매우 나쁜 조언 gets은 안전하게 사용할 수 없습니다. 심지어 C11에서 완전히 제거되었습니다.
Mat

1

오히려 다음 방법을 사용하여 입력을 얻습니다.

#include <iostream>
#include <string>

using namespace std;

int main(void) {
    string name;

    cout << "Hello, Input your name please: ";
    getline(cin, name);

    return 0;
}

공백 문자를 포함하는 문자열에 대해 배열의 총 길이를 정의하는 것보다 실제로 사용하기가 매우 쉽습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.