2013-11-27 3 views
0

다음 프로그램은 사용자가 "Esc"키를 누를 때까지 입력에서 정수 값을 읽고 배열에 저장해야하지만 어떻게해야 하는지를 알 수 없습니다. 조건으로 ASCII 값을 사용하려고했지만 작동하지 않거나 잘못 처리하고 있습니다. 제발 나를 도울 수 있습니까? 다음은 코드입니다.ASCII 값을 조건으로 사용하기

void main(){ 
int i=0, a[MAX]; 
cout <<"Please enter several integer numbers and press Esc when you want to finish" << endl; 
while ((i != char(27)) && (i < MAX)) { 
    cin >> a[i]; 
    i++; 
} 
+0

'main'은'int'를 반환합니다. "그게 뭔데?"라는 말은 무엇을 의미합니까? –

+0

달성해야 할 '27'수표는 무엇입니까? –

+0

이것 좀 보시기 바랍니다 http://stackoverflow.com/questions/17174849/c-how-do-i-minmin-my-programm-using-esc-button –

답변

2

여기에 몇 가지 문제가 있습니다. 가장 중요한 첫 번째이고 가장 중요한 것은 입니다. 대부분의 시스템에서 줄 방향 입력을 수행한다는 의미인데, 이는 제어 문자 (예 : , 아마도 ESC)를 많이 받아 들여 내부적으로 무엇인가를 수행한다는 것을 의미합니다. 돌아 오는 것보다 당신에게 그들; 심지어 입력에 ESC가 표시되지 않을 수도 있습니다.

나머지는 코드에 몇 가지 문제가 있습니다. 은 먼저 읽은 문자 이 아니라 (다음 문자를 넣을 곳)의 배열에 대한 색인을 테스트하고 있습니다. 두 번째는 int을 입력했기 때문에 에는 개별 문자가 표시되지 않습니다. 입력 한 내용의 변환 결과 만 실제로 ESC 문자가 이 통과하면 오류 상태가 std::cin이됩니다. 세 번째는 입력이 인지 여부를 테스트하지 않는다는 것입니다.

더 좋은 해결책은 입력에 대한 다른 규칙을 적용하는 것입니다. 예를 들어 행당 하나의 번호와 빈 줄이 신호음으로 끝납니다. 이 경우, 당신은 같은 것을 쓸 수 있습니다 : (. 당신은 당신이 전면 당신이 얻을 것이다 얼마나 많은 입력 을 알고하지 않기 때문에 내가 std::vector를 사용한 적이 있습니다거야)

std::vector<int> a; 
std::string line; 
std::cout << "..." << std::endl; 
while (std::getline(std::cin, line) && !line.empty()) { 
    std::istringstream parse(line); 
    int value; 
    parse >> value >> std::ws; 
    if (!parse) { 
     std::cout << "That wasn't an integer, try again" << std::endl; 
    } else if (parse.get() != EOF) { 
     std::cout << "Extra garbage at end of line, ignoring it" << std::endl; 
    } else { 
     a.push_back(value); 
    } 
} 

정말로 ESC를 사용하고 싶다면 파티 라이브러리를 curses 행에 따라 원시 입력을 수행하고 한 번에 한 문자 씩 읽고 숫자를 문자열로 변환하여 변환해야합니다 std::istringstream을 사용하십시오.

+0

벡터 대안은 훌륭하지만 Esc를 사용해야합니다. 힌트를 주셔서 감사합니다! – Georgiana

+0

@Georgiana 그럼'std :: cin'을 사용할 수 없습니다. 방금 Windows에서 테스트했는데 콘솔 창에서 적어도 이스케이프 키가 스트림에서 끝나지 않을 것입니다. 당신이 이식성에 대해 걱정하지 않는다면, 아마'getch '가 사용될 수 있지만 그것은 까다로울 수 있습니다. –

0

제임스 방법을 사용하지 마십시오. 더 나은 결과를 얻을 수 있지만 질문에 대답하기 위해 할 수 있습니다. 모든 플랫폼에서 작동하지는 않습니다. Visual C++ 컴파일러에서 작동합니다.

# include <iostream> 
    # include <conio.h> 
    # include <vector> 

    using namespace std; 




int main() 

{ 

    char key; 
    vector<int> a; 
    int temp = 0; 
    while ((key = getch()) != 27) 
    { 
    cin >> temp; 
    a.push_back(temp); 
    } 

    for (int i = 0 ; i < a.size() ; i++) 
    { 
cout << a.at(i) << endl; 
    } 

    printf("Exit"); 
cout << endl; 
system("Pause"); 
    return 0; 

} 

편집 : 이제 프로그램이 더 명확 해집니다. 이 프로그램은 매우 플랫폼 및 컴파일러에 의존해서 사용해서는 안됩니다.

+1

''는 여전히 지원됩니까? (나는 MS-DOS의 옛날부터 이것을 기억하지만, 아직 주위에 있었다는 것을 몰랐다.) –

+0

내 Visual C++ 2012 컴파일러에서 작동하지만 Windows 7에서만 작동한다는 것은 권장하지 않는다. 생각해 보면 –

+0

분명히 윈도우와 관련이있다. 반면에'getch '가'std :: cin'과 어떻게 상호 작용하는지 모르겠습니다. 만약 내가 그것을 사용한다면, 나는 아마 그것을 기반으로 제 자신의'getline'을 구현할 것이고,'getch'와'std :: cin <<'을 혼합하기보다는'std :: istringstream'을 사용하십시오. –

관련 문제