문자열 입력 scanf와 fgets의 차이에 대하여 문의드립니다.

  • tjkim
    tjkim

    DICTIONARY
    http://algospot.com/judge/submission/detail/200151

    문제를 푸는데 입력을 받을때 scanf로 하니 정답이 뜨고
    fgets로 받으니 런타임 오류가 났습니다.

    (테스트 케이스 개수 제외)
    처음 입력 : 단어 개수 (숫자)
    두번째 부터 : 단어 (문자열, 단어 개수 만큼)

    /////////////////////////////////////////////////////
    // fgets 받을때 
    vector<string> words;
    int wordCount;
    scanf("%d",&wordCount);
    fgetc(stdin);
    
    for(int i = 0 ; i < wordCount ; ++i)        
    {
        char tmp[256];          
        fgets(tmp,(sizeof(tmp)/sizeof(char))-1,stdin);
        words.push_back(tmp);
    }
    /////////////////////////////////////////////////////
    
    /////////////////////////////////////////////////////
    // scanf 받을때 
    vector<string> words;
    int wordCount;
    scanf("%d",&wordCount);
    
    for(int i = 0 ; i < wordCount ; ++i)        
    {
        char tmp[256];
        scanf("%s",tmp);
        words.push_back(tmp);
    }
    /////////////////////////////////////////////////////
    

    맨 뒤에 공백(스페이스)이나 \n 같은 문자가 와서 fgets으로 왔을때는 틀린 것일까요?

    왜 scanf일때는 정답으로 나오는지
    어떻게 차이가 있는지 문의드립니다.

    ps. scanf() 입력시 다음에 문자열 입력 받을때 \n 가 들어오는 문제로 fgetc(stdin); 써서 제거 했습니다.
    하지만 scanf로 문자열 입력 받을때도 \n가 없는지 정상 입력되었습니다.


    10년 전
4개의 댓글이 있습니다.
  • tjkim
    tjkim

    fgets(tmp,(sizeof(tmp)/sizeof(char))-1,stdin);
    int l = strlen(tmp)-1;
    if( tmp[l] < 'a' || 'z' < tmp[l])
    {
    tmp[l] = '\0';
    }
    words.push_back(tmp);

    이런식으로 fgets로 받을때 맨 뒤에 영문소문자가 아닐 경우 제거해 주면 정답으로 표시되었습니다.


    10년 전 link
  • Being
    Being

    최초에 wordCount를 입력받을 때에 scanf()를 사용하였는데, 이 때 처리된 위치가 숫자까지만이고 줄바꿈 문자는 아직 처리된 상태가 아닙니다. 따라서 그 다음에 fgets()를 호출하면 그 시점부터 줄바꿈 문자가 들어올 때까지 입력받으므로 빈 줄을 입력받게 됩니다.

    아울러 관리자 권한으로 글의 양식을 수정하였으니 다음번에 질문하실 때에는 수정된 바와 같이 코드를 "~~~ c++" 으로 시작해 "~~~" 으로 끝나도록 해 주시기를 바랍니다.


    10년 전 link
  • tjkim
    tjkim

    수정 감사드립니다.

    scanf() 숫자 입력 받은 후 \n(줄바꿈 문자) 처리 되지 않은 상태에서 다시 scanf()로 숫자를 입력 받으면 아무 문제 없이 입력되었습니다.
    또한 바로 문자열을 받으면 \n(줄바꿈 문자) 을 받아 그냥 넘어가는 경우도 있었습니다.
    위에서 사용한 scanf()로 문자열을 받을때 그냥 넘어가지 않는 현상이 있었습니다.
    이때는 \n(줄바꿈 문자)가 처리된 것 같은데 정확한 차이점을 모르겠습니다.


    10년 전 link
  • JongMan
    JongMan

    scanf()는 줄바꿈 문자나 공백, 탭 등의 문자를 무시합니다. 따라서 \n 처리되지 않은 상태에서 다시 scanf()를 호출하면 다시 숫자가 등장할 때까지 빈칸을 무시하게 됩니다.


    10년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.