2017-02-12 6 views
0

문자열을 입력으로 사용하여 특정 방식으로 조작하는 C++ 프로그램을 만들고 있습니다.입력 된 문자열 대신에 이상한 문자가 나타나는 경우

string input; 
cin >> input; 
char arg = input[4]; //All inputs always have 5 characters 
cout << arg << endl; 

입력 : :이 코드 추가 D

내가 화면에 D를 인쇄 할을 기다리고 있었다 대신 아무것도 Y처럼 (다른 입력, 나는 가끔 이상한 문자를 얻을, 또한 을 인쇄되지 않습니다 그 위에 두 개의 점이 있음)을 출력으로 표시합니다.

왜 이런 일이 발생하며 어떻게 수정 될 수 있습니까? input의 값이 다음, char arg = input[4];add 될 정도로 std::stringoperator<< 대한 추출이 공백

정차 것을
+0

마음이 (가) [MCVE]가 그 문제를하시기 바랍니다 재현 게시하려면? –

+0

오타를 수정 한 후 모든 것이 의도 한대로 작동합니다 (http://ideone.com/E2iBWf). –

+0

"모든 입력은 항상 5 자입니다."라는 주석에 썼습니다. 실제로 'add d'에는 3 자만 있습니다 (첫 번째 토큰을보십시오). – Brandin

답변

3

참고 UB이다.

... 다음 is의 문자를 읽고 다음 조건 중 하나 true가 될 때까지, 마치 str.append(1, c)에 의해 str로 추가 :

  • ...

  • std::isspace(c,is.getloc())은 다음 문자 c에 대해 true이고 is입니다 (이 공백 문자는 입력 스트림에 남아 있습니다).

당신은 지정된 구분 기호까지 문자열을 읽 입력 포함 된 공백을 읽는 대신 std::getline 사용할 수 있습니다; 기본값은 엔드 라인입니다. 예 :

string input; 
std::getline(std::cin, input); 
+2

표준 버전의 중요성을 알지 못합니다. 길이가 3 인 문자열의 경우 [4] 입력은 항상 범위를 벗어납니다. – Brandin

+0

C++ 11 이후로,'input [3]'은 정의되지 않은 동작이 아니지만 실제로는 null 문자에 대한 참조를 반환합니다. 그러나 해당 참조를 수정하는 것은 여전히 ​​정의되지 않은 동작입니다. 어쨌든'input [4]'는 내부적으로 사용되는 배열에는 단지 4 개의 원소 (''add ''와 널 문자)가 있기 때문에 항상 정의되지 않은 행동이다. –

0

예에서 공백을 고려하기 전에 문자 만 입력 (추가 d)하면됩니다. 입력에 가비지 값이 있음 [4]

공백을 입력하려면 큰 따옴표를 사용하십시오. 당신은 D를 추가 전달하면

#include <iostream> 
using namespace std; 
int main(void) 
{ 
string input; 
cin >> input; 
char arg = input[4]; //All inputs always have 5 characters 
cout << input.length() << endl; 
cout << arg << endl; 
} 

, 문자열의 길이는 3,하지 5. 당신은 입력 공간으로 할 수 있도록하려면 수 std::getline(std::cin, input);

cin >> input; 을 교체하고 당신이 원하는 결과를 얻을 것이다 .

4

입력 문자열에서 cin>> 연산자는 공백이 끝날 때까지 문자열을 가져옵니다. 따라서 문자열에 add 만 있기 때문에 네 번째 문자에 액세스하려고하면 아무 것도 표시되지 않습니다.

시도,

string input;  
getline(cin, input);  
char arg = input[4];  
cout << arg << endl;