2012-10-07 3 views
2

저는 방금 C 클래스를 배우기 시작했습니다.이 과제를 위해 노력해 왔지만,이 부분은 제가 당혹 스럽습니다. 나는 기본적으로 보이는 몇 가지 코드가 있습니다왜이 Scanf가 무한 루프를 유발합니까?

그 scanf와 문이 무한 루프가 발생하는 이유
#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    int one = 0; 
    int two = 0; 
    char oneWord[100]; 
    char twoWord[100]; 

    printf("Enter a two digit number: "); 
    scanf("%d%d", &one, &two); 

    strcpy(firstWord, "Test"); 
    strcpy(secondWord, "Two"); 

    printf("%s", firstWord); 

    return 0; 
} 

지금, 옆으로 프로그램의 로직/목적은, 내가 무엇을 알아낼 수 없습니다 것은? 나는 그 문제의 원인이 내가 그것을 주석 처리하고 최종 printf 문장이 잘 작동한다고 판단했습니다.

입력란에 쉼표를 추가했을 때 scanf("%d,%d", %one, %two)으로 변경하려고 시도했는데 제대로 작동하는 것처럼 보였습니다. 하지만 저는 55라는 숫자를 2 자리 숫자로 나눌 수 있기를 바랍니다. 여기 정확히 내가 뭘 잘못하고 있니?

+0

변경 '%의 d' : 오류 처리와

#include <stdio.h> int main() { int a, b; scanf("%2d%1d", &a, &b); printf("%d, %d", a, b); } 

:하지만 당신은 각 정보로 구성되어있는 문자 알려주는 폭 지정자와 함께, 그것을 할 방법을 알 수 있습니다 % s' – janisz

+0

@ janisz - 이유가 무엇입니까? – MByD

+0

죄송합니다. 전 기사를 읽지 않았습니다.한 문자 만 읽으려면'% d '을'% c'(으)로 변경하십시오. – janisz

답변

7

최소 정답이 될 것이다.

d -format-specifier는 10 진수이므로 "0", "41"또는 "2342345"와 같습니다.

당신이 프로그램을 계속 기대 첫 번째 숫자, 를 입력 한 후

하지만 scanf는 두 번째 %d을 수행하기 위해 이렇게 scanf이 기다리고, 첫 %d을 완료했습니다. 이것은 당신에게 무한 루프로 보이는 것입니다,하지만 정말로 당신이 주문한 것을 수행하는 scanf입니다.

scanf은 원하는 각 숫자에 대해 얼마나 많은 자릿수를 추측 할 수 없습니다. `에

#include <stdio.h> 

int main() { 
    int a, b; 
    if (scanf("%2d%1d", &a, &b) < 2) 
     fprintf(stderr, "not enough digits"); 
    else 
     printf("%d, %d", a, b); 
} 
+3

또한 무한 루프가 아니라고 말하십시오. 대신 하나의 숫자 만 입력되기를 기다리고 있습니다. –

+1

@NirajNawanit : 아주 좋은 지적입니다. 감사합니다. –

+0

아아, 이렇게 빨리 많은 사람들이 대답 할 것이라고 기대하지 않았어! 하지만 내가 수행 한 결과는'scanf ("% 1d % 1d", & one, & two)'였고,'scanf ("% 2d % 1d", & one, & two) '? –

2

내가 틀릴 수도 있지만 %d은 "숫자"가 아닌 "정수"를 의미합니다. 따라서 55은 첫 번째 %d이고 두 번째 것은 정의되지 않습니다.

%c (1 자)로 시도 할 수 있습니다. 물론

+1

아마도 맞을 것입니다. 참조를 위해 [this] (http://www.cplusplus.com/reference/clibrary/cstdio/scanf/)를 참조하십시오. 그러나 그의 질문에 완전히 대답하지는 않습니다. –

+1

또한 무한 루프가 아니라고 알려줍니다. 대신 하나의 숫자 만 입력되기를 기다리고 있습니다. –

+1

보다 정확하게 말하면 "d"는 "10 진수", 즉 10 진수를 의미합니다. –

1
printf("Enter a two digit number: "); 
scanf("%1d%1d", &one, &two); 

도이 대신
(요구 사항을 충족하지) 실패 할 수 있습니다 입력이 올바른

scanf("%d", &one); 
if (one<10 || one>99) printf("I didn't expect that...\n"); 

또는

우리가 테스트 후자의 프로그램에서
scanf("%s",oneWord); one = atoi(oneWord); 
if (one<10 || one>99) 
    printf("Thats not necessarily even a number\n"); 
else 
    { two = one % 10; one = one/10; 
     printf("The first digit is %d and the second is %d\n",one,two); 
    } 

입니다 :
올바른 입력 대신 가비지를 입력하고 눈에 띄지 않는 곳에 보려는 것이 좋습니다. 라이브러리 함수 atoi (string); 문자열에 포함 된 정수를 반환합니다. 정수가 발견되지 않으면 0입니다. 예 : (atoi ("a1") == 0).

그러나 당신이로 실행하는 것은 무한 반복이 아니라 scanf 이상의 입력을 기다리고

scanf("%d", number); 
if (number >= 10 && number <= 99) 
{ 
    one = number/10; // the first digit; 
    two = number % 10; // the second digit calculated as number modulo 10 
} 

scanf("%1d%d", &one, &two); // would halt for a single character input 
+1

'one '이 하나의 10 진수 ("d"와 같이) 인 경우 어떻게 9보다 커질 수 있습니까? 그리고 그것이 무엇인지에 대해 확신 할 수없는 오류 검사는 유효한 오류 검사가 아닙니다. –

+1

첫 번째 예를 시도해보고 예를 입력하십시오. 123; 2 자리 숫자가 아닙니다. –

+0

첫 번째 형식 문자열과 달리 두 번째 형식 문자열에서 너비 지정자를 사용하지 않았다. 그러나 숫자 문자열을 여러 숫자로 해독하는 질문자 문제를 해결하지는 못합니다. 또한 : 두 번째 예제는 현재의 문제를 해결하기에는 너무 가깝습니다. 적어도 당신이 거기에서 뭘하고 있는지 설명해 주시겠습니까? –

관련 문제