fgets의 이상동작...동작하지 않습니다
글쓴이: mixmccym / 작성시간: 수, 2007/12/19 - 4:22오후
우분투에서 소켓을 이용하여 간단한 약식 ftp형태의 프로그램을 짜고 있습니다
그런데 클라이언트의 업로드를 위하여 파일명을 입력받는 부분에서
알수없는 현상이 일어나네요
아래의 같이 소스의 일부분을 올려봅니다..
clientlist함수에서 readdir함수를 이용하여 현재 있는 폴더의 내용이
정성적으로 보이는데 이제 업로드를 위하여 파일을 입력받는 부분에서
다시말해 fgets부분이 제대로 동작을 하지 않고 (입력을 받지않고)
바로 다음내용으로 넘어갑니다
그러니 테스트를 위해 파일이름과 이름의 길이를 출력해보면
파일명: @파일명의 길이: 1
이렇게 뜹니다. 혹시나 해서 scanf를 사용하여 받아보면
scanf("%d",frame.filename)이라고 치면 역시 마찬가지로 입력받지않고 넘어가고
scanf(" %d",frame.filename)이런식으로 한칸 뛰어 입력받으면
입력은 받을수 있으나 역시나 쓰레기 값이 들어갑니다.
fflush를 사용해도 마찬가지이군요.
왜 이런 현상이 일어날까요?고수님들의 조언 부탁드립니다.
clientlist();//현재 폴더의 파일을 보여줌 printf("리스트를 보고 업로드 시킬 파일을 입력해주세요!"); printf("\n\n파일이름입력>"); fflush(stdin); //scanf("%s",&frame.filename); if( fgets(frame.filename,sizeof(frame.filename),stdin)==NULL) { printf("파일명이 올바르지 않습니다. 다시선택해주세요!\n\n"); break; } */ frame.filenamesize=strlen(frame.filename); printf("파일명: %s",frame.filename); printf("파일명의 길이: %d\n",frame.filenamesize);
참고로 구조체의 내용은
struct data{
char filename[30];
char send_buf[257];
int filesize;
int filenamesize;
};
이런식으로 되어있습니다.
Forums:
위 소스를
위 소스를 컴파일해서 실행해본 결과
별 문제 없이 잘 동작했습니다.
if 문 안에 break; 가 있는걸로 봐서 원래는 뭔가 for 나 while 루프안에서
fgets 입력을 받는것 같은데,
루프끝날때 마다
filename 변수를 0 으로 초기화 해 보세요..
memset() 참고..
----
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
그러니까 mixmccym님의
그러니까 mixmccym님의 질문 내용이..
파일명: @파일명의 길이: 1
이렇게 뜹니다. 혹시나 해서 scanf를 사용하여 받아보면
이 부분인것입니까?
만일 a 라고만 입력하고 엔터를 쳤을 경우 strlen 해 보았을 경우 2 로 출력되는.. 그걸 물어보시는것 같은데.. 뒤이어 적으신
scanf("%d",frame.filename)이라고 치면 역시 마찬가지로 입력받지않고 넘어가고
scanf(" %d",frame.filename)이런식으로 한칸 뛰어 입력받으면
이 부분땜에 약간 헷갈리는군요.
애시당초.. frame.filename 은 스트링 형인데, %d로 입력 받도록 하면 목적하던 문자열이 아니라 정수 하나 달랑 가져다가 [0]번 배열에 넣고 말텐데..
뭐. 어쨌든.. 처음으로 이해한 대로 말씀을 드리자면.. 입력값으로 넣은 것이
ABC
라고 하였을 경우
변수에 저장되는 실제 내용은
'A' 'B' 'C' '\n' '\0' 'XX' 'XX' 'XX' 'XX' ... ('XX'는 알 수 없는 값이란 의미로 쓴거.)
이렇게 저장 됩니다.
strlen 같은 스트링 함수는 문자열의 끝, '\0' 까지 세기 때문에
'A' 'B' 'C' '\n' : 4글자.
그래서 3글자가 아니라 4글자로 세는 것이죠..
에.. 질문의 의도가 이게 아니었다면... ㄷㄷㄷ
주소를 넘겨주셔야 하지 않나요?
if( fgets(frame.filename,sizeof(frame.filename),stdin)==NULL)
fgets( (&frame.filename), ...);
이런식으로 해야 올바르지 않을지...
frame.filename 얘는
frame.filename 얘는 배열로 선언된 것이라서, 저거 자체가 주소예요.
그래서 & 붙이이면.. 이상해 져요 ^^:
앗 죄송합니다..저는 syntax의 문제를 못찾으시는줄알고..
역시나 돌려봤는데 문제가 없는데...
gets()는 gcc에서 warning을 일이키기 때문에 fgets(, .. ,stdin)으로 하신것 같은데...
정확히 무엇이 문제인지...
혹시 fgets()의 문제가 아니라 scanf()에 관한 문제는 아닌지요??
댓글 달기