2012-01-02 2 views
2

여기에 Noob 질문이 있지만 안전하고 정확한 방법으로 사용자 입력을 알아 내려고 노력하고 있습니다. (참고로 이것은 GNU C 프로그래밍 자습서의 Morse 코드 배열 연습입니다. 10.6 (58-59) 및 15.5.5 (107)).단일 문자 사용자 입력 및 fgets

내 원하는 프로그램 흐름은 다음과 같습니다에 대한

  • 프롬프트 사용자가 하나의 숫자
  • 되는 사용자 입력
  • 사용자 입력 유효성 검사
  • 경우 유효한 인쇄 올바른 배열 항목

문제는 단순히 사용자가 하드 리턴을 입력하면 배열 읽기 기능이 my_array [0]에서 읽고 인쇄한다는 것입니다. 나는 반환이 검증을 실패하게하는 방법을 알아낼 수 없다. 주에서

:

if (get_line (digit_input, sizeof (digit_input), stdin) != NULL) { 
    if (validate (digit_input) == 0) { 
    digit = atoi (digit_input); 
    printf("\nThe Morse code for %d is: ", digit); 
    morse(digit); 
} 

get_line 및 검증 기능 : 나는 빈 입력을 무효화 할 수있는 방법

char *get_line(char *s, size_t n, FILE *f) { 
    unsigned int last; 
    char *p = fgets (s, n, f); 

    if (p != NULL) { 
    last = (strlen(s) - 1); 
    if (s[last] == '\n') s[last] = '\0'; 
    } 
    return p; 
} 

int validate(char *a) { 
    unsigned x; 

    for (x = 0; x < strlen(a); x++) 
    if (!isdigit(a[x]) || (a[1] != '\0')) return -1; 

    return 0; 
} 

? (즉, 문자열이 \ n \ 0을 읽는 경우) 왜 문자가없는 (즉, \ n) 입력이 0으로 만들어져 배열 읽기 함수로 전달됩니까?

도움을 주신 모든 분들께 감사드립니다.

답변

0

validate 함수의 beggining에 다음 테스트를 추가합니다 : 그래서

if (strlen(a) == 0) return -1; 

, 문자열의 길이가 정확히 1이고 문자가 숫자입니다

그냥 명시 적으로 확인 빈 입력은 무효화됩니다.

+0

감사합니다. 가장 일반적인 것 같아서이 줄을 사용하게되었습니다. 비어있는 항목이 잘못된 입력 형식과 다른 문제라고 생각했기 때문에 비 숫자 항목과 다른 반환 값을 설정하십시오. –

+0

"strlen (a) == 0"은 잔인합니다 (일부 시나리오에서는 성능이 저하 될 수 있음). "a [0] == '\ 0'"은 훨씬 더 빠릅니다. 왜 문자열이 끝나야 비어 있는지 알기 만하면됩니다. – ugoren

+0

@ ugoren point taken. 지금은 유효성 검사가 get_line에 의존한다는 사실을 깨닫게되었는데, 그 이유는 main()하지만 한 번에 한 단계 씩 나쁘다는 것입니다. –

1

validate 함수는 strlen()이 0 일 때 0을 반환합니다. 이는 0이 아닙니다.

0

정확히 한 자릿수를 입력해야한다고 올바르게 이해합니까?

int validate(char *a) { 
    return strlen(a)==1 && isdigit(a[0]) ? 0 : -1 
}