여기에 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으로 만들어져 배열 읽기 함수로 전달됩니까?
도움을 주신 모든 분들께 감사드립니다.
감사합니다. 가장 일반적인 것 같아서이 줄을 사용하게되었습니다. 비어있는 항목이 잘못된 입력 형식과 다른 문제라고 생각했기 때문에 비 숫자 항목과 다른 반환 값을 설정하십시오. –
"strlen (a) == 0"은 잔인합니다 (일부 시나리오에서는 성능이 저하 될 수 있음). "a [0] == '\ 0'"은 훨씬 더 빠릅니다. 왜 문자열이 끝나야 비어 있는지 알기 만하면됩니다. – ugoren
@ ugoren point taken. 지금은 유효성 검사가 get_line에 의존한다는 사실을 깨닫게되었는데, 그 이유는 main()하지만 한 번에 한 단계 씩 나쁘다는 것입니다. –