fgets을 통해 받은 문자열의 끝과 내용

조회수 1507회

fgets() 함수는 결과를 string에 저장하고 스트링 끝에 널(null) 문자(\0)를 추가합니다. 라고 ibm에서는 설명하고 있습니다.

fgets() 함수를 통해 문자열을 받은 것을 제가 키보드를 통해 입력한 문자열과 비교하려는데, strcmp함수를 통해 비교하려 하였는데, 모니터상에서는 완벽히 같은 출력이지만 0이라는 결과값 대신 다른 결과값이 나오고 있습니다.

실제로 fgets함수를 통해 받은 문자열을 보니, 제가 원하는 string이 끝나는 부분이 tap으로 출력되어 나옴을 확인할 수 있었는데, 왜 이러한 현상이 발생하는 것인지 알고 싶습니다.

    for(i = 0; i < 30; i++){
                    if((buffer[i] == '\t') || (buffer[i] == '\0') || (buffer[i] == ' ') || (buffer[i] == '\n')){
                        break;
                    }
                }

                if(strncmp(buffer, PW, i) == 0){
                    c = 0;
                }

현재는 위와같은 방식으로 여백이 나타날수 있는 경우들을 모아 예외처리를 통해 string의 길이를 통한 비교를 하고 있습니다.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • C언어에서 문자열(string)은 '\0' 으로 끝나는 일련의 문자 집합을 의미합니다.

    fgets 는 지정된 file descriptor 에서 line 단위로 읽어서 buffer에 담아주는 함수인데 file에 저장된 raw data에는 '\0' 널문자가 포함되지 않기 때문에 추가해주는 것입니다. 널문자가 없다면 현재 읽어온 string의 length를 알 수 없게 되겠죠.

    file에 여러 개의 line이 존재하는 경우 일반 텍스트 뷰어에서는 보이지 않지만 각 라인의 끝에는 '\n' 개행문자가 있습니다.

    따라서 키보드로 입력한 문자열과 fgets로 가져온 문자열을 비교하려면 아래와 같이 하시면 됩니다.

    // fgets로 buffer에 read
    
    buffer[strlen(buffer) - 1] = '\0'; // '\n' 개행 문자를 널문자로 변경
    
    if(strcmp(buffer, PW) == 0)
     c = 0;
    
    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 감사합니다. 잘 작동하는 것을 확인하였습니다. 의문이 드는 것은 strlen(buffer) - 1부분인데 왜 같은 문자열인데도 불구하고 strlen의 길이가 다른지, strlen은 어떤 방식으로 buffer에 있는 문자열의 길이를 읽어오는 지 궁금합니다. 분명 buffer에 있는 내용이 law data라면 \0이 없기 때문에 어디가 문자열의 끝인지 명확하게 모르는 경우이지 않나요? 알 수 없는 사용자 2019.3.9 15:27
    • strlen 은 널문자까지의 길이를 리턴해주며, buffer는 fgets 함수에서 맨 끝에 널문자를 추가해줬기 때문에 strlen 으로 길이를 구할 수 있습니다. 알 수 없는 사용자 2019.3.11 15:04

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)