2017-09-09 5 views
0

사용자가 입력 한 사용자 이름의 유효성을 검사하는 프로그램을 작성 중입니다. 이 프로젝트의 목적 상, 영문자 (대문자 또는 소문자), 숫자 또는 밑줄을 사용할 수 있지만 공백이나 다른 구두점은 사용할 수 없습니다. 또한 총 5 ~ 10 자 사이 여야합니다. 한 번에 한 문자 만 저장할 수 있다는 것을 알고 있기 때문에 getchar()을 사용하여 문제가 발생한다고 생각합니다. 그러나이를 고칠 수있는 최선의 방법은 확실하지 않습니다. 현재 내 코드를 실행할 때 잘못된 것으로 만 돌아옵니다. 루프를 변경하거나 조정해야합니까? 아니면 if 문에 문제가 있습니까?C에서 getchar() 작업

#include <stdio.h> 
#include <ctype.h> 

int main(void) 
{ 


    int ch; 
    int len = 0; 


    printf("Enter the username: "); //prompt user to enter a username 
    ch = getchar(); 


    while (ch != '\n') //while loop checking for length of username 
    { 
     len++; 
     ch = getchar(); 
    } 

    if(isspace(ch) || ispunct(ch) || len > 10 || len < 5){ 

      printf("invalid input."); 
    } 

    else{ 
    printf("valid input."); 
    } 

    return 0; 

} 
+2

: 당신이 아직 코멘트에서 문제가있는 것 때문에

편집 , 나는 여기에 가능한 솔루션을 추가하기로 결정했다. – BLUEPIXY

+0

유사 [질문 (https://stackoverflow.com/questions/46107545/c-language-cant-check-getchar-is-alphabet-or-digit) – BLUEPIXY

답변

1

이 기능의 문제점은 isspace(ch)입니다. 문자가 공백 문자이면 0이 아닌 값 (true)을 반환합니다. 당신이 먹는 마지막 동작이 마지막 문자는 OS ('\ 연구 \ n을'에 따라 줄 바꿈 또는 캐리지 리턴 될 것입니다, Enter 키를 누르면되기 때문에 표준 백색 공간 '\ n'또는 '

' ' (0x20) space (SPC) 
'\t' (0x09) horizontal tab (TAB) 
'\n' (0x0a) newline (LF) 
'\v' (0x0b) vertical tab (VT) 
'\f' (0x0c) feed (FF) 
'\r' (0x0d) carriage return (CR) 

입니다 \아르 자형').

난 당신이 이름이 문자 사이에-공간이 있는지 확인하도록 생각합니다. 당신이하고있는 방식으로, 당신은 단지 마지막 것을 확인합니다. 버퍼에 모든 문자를 추가하고 나중에 확인하거나 초기 문자를 변경하여 유효하지 않은 문자를 검사 할 수 있습니다. 당신은 루프에서 문자의 종류를 확인해야

#include <stdio.h> 
#include <ctype.h> 

int main(void) 
{ 
    int ch; 
    int len = 0; 

    printf("Enter the username: "); //prompt user to enter a username 
    ch = getchar(); 


    while (!isspace(ch) && !ispunct(ch)) //while loop checking for length of username. While it's not(note the exclamation mark) a whitespace, or punctuation, it keeps going(newline is considered a whitespace, so it's covered by the loop). 
    { 
     len++; 
     ch = getchar(); 
    } 

    if (ch == '\n' && len <= 10 && len >= 5) {//if it found the newline char(considering the newline is \n), it means it went till the end without finding other whitespace or punctuation. If the lenght is also correct,then the username is valid 
     printf("valid input."); 
    } 
    else {//if the loop stopped because it found a space or puncuation, or if the length is not correct, then the input is invalid 
     printf("invalid input."); 
    } 

    return 0; 
} 
+0

확인. 나는 문제가 내가 마지막 캐릭터 만 체크하고있을 것이라고 생각했기 때문에, 나는 적어도 내가 올바른 길을 가고 있다는 것을 듣고 기쁘다. while 루프에 대해 무엇을 변경해야합니까? 나는 isspace (ch)를 추가하려고했다. ispunct (ch) '조건을 만족시키지 못했지만 조건을 충족시키지 못하기 때문에 while 루프를 신경 쓸 필요가 없다는 것을 깨달았습니다. 좋아 –

+0

그래서 나는 완전히 isspace와 (CH) 함수를 제거하며) (심지어 spaces..although 감지 내가 채널 (나는! = EOF? 어쨌든 나는 ispunct을 왼쪽에 추가 어쩌면 때문에 방법. 모르겠어요 작동하는 것 같군 문장 부호와이 여전히 가능 있어요 ...이 단지 마지막 문자를 확인 어떻게 같은 문제입니까? –

+0

내가 가능한 솔루션으로 해답을 편집 지금 문제가 내 동안 문이었다보세요!이 – savram