2011-09-28 3 views
1

숫자를 하나씩 입력하라는 코드를 작성하려고했는데 특정 문자가 삽입 된 경우 (이 경우 'x') 루프가 중지됩니다. 하지만 그 문자를 삽입하면 "Insert Number"라는 문자로 나를 스팸으로 시작합니다. 내가 잘못 int 배열에 숯불을 삽입하려고 노력하고 있다고 생각하지만 주위에 방법을 생각할 수 없다.C++은 특정 기호까지 숫자를 삽입합니다.

long int numbers[100]={0}; 
char h='y'; 
int index=0; 
do 
{ 
    cout << "Insert Number : "; 
    cin >> numbers[index]; 
    h=(char)numbers[index]; 
    index++; 
} 
while(h!='x'); 
+1

문자열을 읽을 다음, 당신은 무엇을해야하는지 알 것입니다. –

+0

이 경우 스팸은 무엇을 의미합니까? 당신은 무한 루프로 빠져 나옵니까? – arne

+0

문자를 정수로 읽을 수 없습니다. 다른 방법으로 시도해보십시오. – mydogisbox

답변

0

당신은 같은 루프를 작성해야합니다 : 그것은 모든 정수를 읽습니다

while(cin >> numbers[index]) 
    index++; 

을, 당신은 몇 가지 잘못된 입력을 입력 전까지, 그것은 'x' 또는 다른 문자 수.

char ch; 
do 
{ 
    while(cin >> numbers[index]) 
     index++; 
    cin.clear(); //clear the error flags, so you can use cin to continue reading 
    cin >> ch; //read the invalid character 
} while(ch != 'x'); 
: 모든 유효하지 않은 입력을 생략하고 (유효하지 않은 입력 후 될 수있는) 정수를 읽고 계속 루프를 종료 만 'x'을 고려할하려면 이제, 다음과 같은 다른 루프 위의 루프를 포장

한 조언 : long int numbers[100]보다 std::vector<long int>을 사용하는 것이 좋습니다. 사용자가 100 개 이상의 정수를 입력하면 프로그램이 손상됩니다.

+0

@ 이것은 정의되지 않은 동작을가집니다 (그러나 영원히 반복 할 가능성이 있습니다). 일단 내부 루프가 실패하면,'cin'은 에러 상태에 있으며, 더 이상의 입력이 받아 들여지기 전에 반드시 지워 져야합니다. –

+0

@ JamesKanze : 고마워요. 나는 그것을 잊었다. :-) – Nawaz

2

'x'는 숫자가 아니며 cin >> numbers[index]; 작업이 실패하고 해당 데이터를 소비하지 않기 때문에 발생합니다. 그래서 루프가 계속되고, 같은 x이 다시 실패하고 모든 것이 다시 시작됩니다. 당신은 입력 작업이 같은 결과를 확인할 수 있습니다

#include <iostream> 

using namespace std; 

int main() 
{ 
    long int numbers[100]={0}; 
    char h='y'; 
    int index=0; 
    do 
    { 
     cout << "Insert Number : "; 
     if (cin >> numbers[index]) 
     { 
      h=(char)numbers[index]; 
      index++; 
     } 
     else 
     { 
      cout << "Hey, that was not a number! Bye." << endl; 
      break; 
     } 
    } 
    while(h!='x'); 
} 
+0

이 방법을 쓰면 사용자가 120을 입력하면 종료됩니다 (120 번 캐스팅은 'x'를 제공합니다). –

+0

@EdwardLoper : 참. 그러나 나는 그것을 쓰지 않았다 :) 'x'를 가진이 모든 이야기는 나쁜 생각이다. –

0

당신은, 정수의 숫자를 숫자로 변환 할 수 없으며 잼 것 아닌 모든 문자를 읽기 위해 노력하고 있기 때문에 입력을 올리면 오류가 발생하고 잘못된 문자는 스트림에서 제거되지 않습니다. 다음에 읽으려고하면 동일한 오류가 발생합니다.

0

는 숫자 나 문자열을 기대한다면, 항상 문자열로 입력을 읽고, 문자열이 "x"가 아닌 경우 이후 숫자로 변환하려고 :

#include <vector> 
#include <string> 
#include <sstream> 
#include <iostream>  

int main(int argc, char *argv[]) 
{ 
    std::vector<long int> numbers; 
    std::string line; 
    while(std::getline(std::cin, line) && line != "x") { 
     std::istringstream input(line); 
     long int value; 
     // Check that there is only a number with nothing else after 
     if((input >> value) && input.get() == std::char_traits<char>::eof()) { 
      numbers.push_back(value); 
     } else { 
      std::cout << "Invalid Entry, please retry" << std::endl; 
     } 
    } 

    //... 

    return 0; 
} 
관련 문제