2012-05-31 4 views
0

내 문제에 대한 간단한 해결책을 찾을 수 없어서 빠른 질문입니다. 사용자 입력을 정수로 가져 오는 방법이 있습니까? 문자열을 입력하면 프로그램이 중단되지 않고 대신 "오류"가 표시됩니다.입력 문자열과 정수

나는이 문제를 해결하기 위해 노력해 왔습니다. 문자열을 정수로 또는 그 반대로 변환하지만, 계속해서 "기본 10의 int()에 대해 유효하지 않은 리터럴"을 얻거나 "오류"가 표시되면 무한 루프에서이를 수행합니다. 여기

내 코드는 단지 이상 3

+2

사용에 raw_input() 대신 입력보다()와 수동으로 변환하여 실패 할 경우 예외를 catch합니다. –

+0

Python 2.x 또는 3.x? –

답변

9

을하지만 난 항상 "기본 10) (INT에 대한 잘못된 문자"얻을 오류

예외가 발생했습니다. 구체적으로는 ValueError입니다. except 블록을 사용하여 예외를 catch 할 수 있습니다. 자세한 내용은 지금까지 사용해 본 언어 자습서를 참조하거나 except block Python에 대해 Google에 문의하십시오.

"오류"가 표시되면 무한 루프가 발생합니다.

입력이 올바르지 않다는 것을 감지하면 루프를 다시 시도하기 전에 새로운 입력을 받아야합니다. 당신의 루프 안에 입력 물건을 넣으십시오. 루프에 추가하여 재귀 (을 main에서 호출)를 사용하지 마십시오. 너는 단지 이런 식으로 자신을 혼란스럽게 할 것이다. 루프 내부에 들어갈 때까지 choice의 값을 얻지 못하기 때문에 적절한 choice 값을 찾으면 명시 적으로 break 루프에서 벗어나기 쉽습니다 (루프를 제어하려고 시도하는 대신에). while 조건).

루프 구조를 단순화하기 위해 continue을 사용할 수도 있습니다. try 블록에서 모든 작업을 수행하는 대신 숫자를 추출하는 부분으로 제한합니다. except 블록에서 continue을 사용하여 실제 숫자가 없을 때 루프의 나머지 부분을 건너 뛰고 나머지 루프 만 수행합니다. (결국, 어쩌면 코드 우리는 몇 가지 완전히 다른 이유 choice == 1 또는 choice == 2raise ValueError을 요구, 우리는 그것에 대해 뭔가 다른 일을 할 것입니다.)

while True: 
    try: 
     choice = int(raw_input("Give me a number")) 
    except ValueError: 
     print "Could you at least give me an actual number?" 
     continue 

    if choice == 1: 
     do_something() 
    elif choice == 2: 
     do_something_else() 
    elif choice == 3: 
     break 
    else: 
     print "Try a different number" 
+0

아, 나는 지금까지 나의 튜토리얼에서 블록을 제외하고 try와 익숙하지 않았다. 그러나 그것은 꽤 간단하고 솔직하게 보인다. 나는 당신의 대답을 매우 고맙게 생각합니다, 이것은 지금 당장 나를 괴롭혔습니다! 감사합니다 :) 사실, 대답의 일부는 혼란 스럽습니다. 사용자가 숫자를 입력하지 않으면 루프의 나머지 부분은 건너 뜁니다. 그렇기 때문에 본질적으로 참일 때도 마찬가지입니다. 시도해보십시오. 최종 입력이 주어질 때까지 무한 루프? – Jertise

+1

위의 내용을 강조하기 위해 raw_input을 입력 대신 사용하는 것이 좋습니다. 특히이 프로그램이 광범위한 잠재 고객에게 배포되어야하는 경우에 적합합니다. input()에 전달 된 명령문이 평가되고 임의의 명령을 수락하면 보안 구멍이 생깁니다. http://docs.python.org/library/functions.html#input – abought

0
미만 1. 정수뿐만 아니라

choice = input("Enter your choice: ") 

while choice != 3: 
    if choice == 1: 
     get_songs() 
     print 
     main() 
    elif choice == 2: 
     read_songs() 
     print 
     main() 
    else: 
     print "Invalid choice" 

그래서 기본적으로 나는 다른 작업이 문자열을 작업 할 질문을 삭제하기 위해입니다

항상 선택! = 3이므로 무한 루프가 발생합니다. "else"조건으로 점프하면 입력을 다시 받아야합니다.

0

여기에 뭔가가 있습니다. 나는 사용자가 문자열 주위에 ""을 입력하게 만드는 것을 싫어합니다. (주석에서)

ch = raw_input("Enter choice: ") 
#ch *is* a string at this point 
if ch.isdigit(): 
    choice = int(ch) 
else: 
    print "Invalid choice" 

편집 :

isdigit

제대로 로케일 인코딩을 처리 할 수 ​​있습니다. 파이썬 3에서 대신 isdecimal을 사용할 수 있습니다.   — J.F. 세바스찬은 당신의 코드에서

+1

일부 로케일에서'isdigit()'는 부정확 할 수 있습니다 ('int'는 입력을 거부합니다). 파이썬 2는 C'isdigit()'를 사용합니다 : [C에서 로케일에 합법적으로 종속 될 수 있습니까] (http://stackoverflow.com/q/2898228/4279). 입력이 ascii ('ord (ch) <128')인지 확인하거나 try/except를 사용하십시오. 파이썬 3에서는 대신'isdecimal()'을 사용하십시오. – jfs

0

while 루프는 input() 라인을 캡슐화한다.

사용자 입력 얻는 함수 만들기 : :이 명확한 대안은 그러나됩니다 다음

def getInteger(prompt): 
    while True: 
     userIn = input(prompt) 
     try: 
      return int(userIn) 
     except ValueError: 
      print "Error" 
관련 문제