2010-06-19 4 views
1

내 C++ 예제에 불쾌한 문제가 있습니다. 공백 문자를 입력 할 때까지 모든 것이 잘 작동합니다. 이상한 C++ 입력 이스케이프 및 공간 동작

#include <iostream> 
using namespace std; 

int main (int argc, char * const argv[]) 
{ 
    int iteration = 0; 
    while (true) { 
     char * input = new char[256]; 
     scanf("%s", input); 
     cout << ++iteration << ": " << input << endl; 
     cin.get(); 
    } 
    return 0; 
} 

그래서이 코드와 함께, 난 아무것도 입력 할 수 있지만 공백 이후 모든 버퍼에 저장하고 두 번째 반복에서 사용 어떻게 든 같다.

foo 
1: foo 
bar 
2: bar 
foobar 
3: foobar 
foo bar 
4: foo 
5: bar 

모든 단일 입력 읽기 기능이 작동하여 나를 미치게 만듭니다. cin >> input, freads(), cin.get() 등이 모두 수행합니다.

사용자 입력시 자주 발생하는 문제입니까? 아니면 여기에 잘못된 것이 있습니까?

+2

메모리를 절대 삭제하지 마십시오. 당신은 모든 반복을 유출합니다. 크기를 하드 코딩하는 경우 (그리고 크기가 작을 때), 동적으로 할당하는 목적이 보이지 않습니다. 그냥'char input [256]'을 수행하십시오. 어쨌든 동적 배열이 실제로 필요하다면'std :: vector'를 사용하십시오. 정말로 원하는 것은'std :: string'입니다. – GManNickG

+0

@GMan 감사합니다. 다음 번에 더 잘할 것입니다. –

+0

사실. 기본적으로 가능한 한 동적 할당을 피하십시오. 그리고 필요할 때 자동으로 해제시켜 누출되지 않도록 수업을 이용하십시오. ('vector'와'string.'처럼) :) – GManNickG

답변

4

우선 scanf을 사용하지 마십시오. 이 함수를 사용하고 버퍼 오버플로를 피하는 것은 어렵습니다. inputstd::string으로 바꾸고 std::cin에서 읽습니다.

scanf("%s", input)cin >> input은 모두 공백으로 구분 된 한 단어를 읽습니다. 전체 줄을 읽으려면 getline(cin, input)을 사용하십시오.

1

소개 scanf %s format specifier : 공백이 발견 될 때까지 후속 문자를 읽

(공백 문자를 공백, 줄 바꿈 및 탭 것으로 간주됩니다).

는 약 istream::operator>> with str parameter : 다음 문자가 유효한 공백 또는 널 문자, 또는 파일의 마지막에 이르렀을 경우 중 하나 일 때

추출이 종료됩니다.

그렇습니다.이 기능은 표준 동작입니다.