본문 바로가기
Programming

fgets 사용시 유의점.

by 단창 2011. 11. 12.
프로그래밍을하면서 삽질은 필연적으로 따라오는 것이지만 오늘은 아주 기본적인 실수로 간만에 굉장한 삽질을 하였던 터라 포스팅해본다. 

  FILE* ft;
    ft = fopen("ip_port2.txt","w");
    char* str = "10.15.10.172\n8888\n10.15.10.99\n8888\n";
    fputs(str,ft);
    fclose(ft);
       
    cout << "**1" << endl;
    char ipstr1[16+1];
    char ipstr2[16+1];
    char portstr1[4+1];
    char portstr2[4+1];
    
    FILE* fp;
    fp = fopen("ip_port2.txt","rt");
    
    fgets(ipstr1,100,fp);
    fgets(portstr1,100,fp);
    fgets(ipstr2,100,fp);
    fgets(portstr2,100,fp);    
    fclose(fp);
    cout <<"1 :"<< ipstr1 << endl;
    cout <<"2 :"<< ipstr2 << endl;
    cout <<"3 :"<< portstr1<<endl;
    cout <<"4 :"<< portstr2<<endl;


이것을 돌리면
1: 10.15.10.172
2: 8888
3: 10.15.10.99
2: 8888
이 당연히 나와야 하는건데 ipstr 이 이유없이 첫바이트가 NULL로 시작하는등 왜 이럴까 하고 한참을 생각했다.
왜 이럴까 왜 이럴까.. 

원인은 이런것이었다.  fgets는 \n까지 읽어서 char* 에 넣는다. 그리고 "NULL을 마지막 바이트에 자동적으로 붙인다" 왜냐하면 fgets는 문자를 지정된 개수 만큼 읽는 함수가 아니라, 문자열을 자동으로 찾아일고 문자열을 완성해 주는 함수니깐.. 마지막에 NULL이 들어갈 자리를 만들어 줘야 한다.. 
따라서,  

    char ipstr1[16+1+1];
    char ipstr2[16+1+1];
    char portstr1[4+1+1];
char portstr2[4+1+1]; 
이렇게 NULL이 들어갈 자리를 뒤에 만들어 줘야한다..

크아..  
이런걸로 시간보내고 나면 괜히 허무하다.

 
반응형