유닉스에서 만든 간단한 프로그램입니다. 실행이 이상합니다 도와주세요
이런 간단한 소스 질문을 여기에 올려도 될지 모르겠네요....
근데 정말 이상한 부분이 없는데 안되서 이렇게 질문 드립니다.
우선 간단한 명함관리 프로그램을 유닉스 환경에서 짜본겁니다
struct card; 라는 구조체를 선언하여고, 여기에는 name과 phone 이렇게 두개가 있습니다.
각각 16바이트로 할당했으며 결국 card 구조체는 총 32바이트 입니다.
countCard는 총 명함(card 구조체)의 개수이며, 변수값 i는 찾을 명함의 번호입니다.(0번 부터 ~ 마지막 번호까지)
이 코드가 실행되기 전에 open함수로 mynamecard라는 파일을 오픈해서 fd에 파일 디스크립터를 저장했습니다.
mynamecard에는 다른 프로그램으로 작성한 명함 데이터들이 이미 들어있고요.
궁극적으로 이 코드는 이미 작성된 명함을 찾아서 보고 수정하는 코드입니다.
다른 부분들은 이미 다른 프로그램에서 검증된 코드라 문제가 없는것 같은데
printf("Set a new name : ");
gets(card.name);
printf("Set a new phone : ");
gets(card.phone);
이부분이 수행이 잘되지 않습니다.
실행을 해보면 [ Set a new name : Set a new phone : ] << 쉘에 이런식으로 출력이 되고, gets(card.name); 함수를 씹어버리는것 같습니다.
저렇게 해서 입력을하면 실제로도 name변수에는 아무 값도 안들어가고 phone값에만 제가 입력한 값이 수정되더라구요.
특별한 함수구간도 아니고 별다를거 없는 부분인데 왜 수행이 안되는건지 문제가 뭔지 알고싶습니다..
윗부분 코드가 더러워서 일부로 보기 편하시라고 중간만 잘라왔습니다. 혹시 전체 코드를 보고싶으시면 댓글 남겨주시면 다시 올리겠습니다.
do { /* 몇번째 명함을 찾을지 묻는 부분 */ do { printf("\nENTER THE i, WHAT YOU WANT : "); scanf("%s", buf); i = atoi(buf); /* 존재하지 않는 명함번호를 입력했을시 다시 입력하게 한다 */ if( i < 0 || countCard < i) { printf("[ERROR, PLEASE ENTER THE RIGHT NUMBER.]\n"); i = -1; } } while( i == -1 ); // 올바른 번호(i != -1)가 입력될 때까지 반복 /* 받은 숫자를 이용해 그 번호의 명함을 찾아 보여주는 부분 */ lseek( fd, i*sizeof(card), SEEK_SET ); read( fd, &card, sizeof(card) ); printf("[Name] : %s\n", card.name); printf("[Phone] : %s\n", card.phone); /* 원래있던 내용을 새롭게 바꾸는 부분 */ printf("Set a new name : "); gets(card.name); // [!여기가 문제점!] 이 부분을 무시하고 넘어감. printf("Set a new phone : "); gets(card.phone); /* 파일 오프셋을 처음 받았던 숫자로 다시 변경 후 그 부분의 내용을 고친다 */ lseek( fd, i*sizeof(card), SEEK_SET ); write(fd, &card, sizeof(card)); printf("COUNTIUE? (Y/N) : "); scanf("%s", buf); } while( !strcmp(buf, "y") || !strcmp(buf, "Y") ); // 종료문자를 입력 할 때까지 전체 프로그램 반복
printf("Set a new name :
printf("Set a new name : ");
scanf("%s", card.name);
printf("Set a new phone : ");
scanf("%s", card.phone);
문제되는 지점을 scanf 함수를 사용했더니 요류없이 잘돌아 갑니다...
결국 gets()가 문제였는데 왜 gets 함수를 사용하면 문제가 생기는 건가요.
그것도 다른 부분에서도 gets()함수를 사용해서 문제없이 돌아갔는데 유독 저부분에서 문제가 생긴 걸까요
입력시 엔터가 들어가기 \n 때문입니다.
아마 그럴겁니다.
입력 엔터시
아마도. gets는 엔터를 입력 받게 되면 넘어갈겁니다.
그러니까. \n 입력 엔터를 데이터에서 지워줘야 합니다.
다른 방법으로는. fflush(stdin);등으로도 가능한걸로 기억합니다.
아닐지도 모릅니다. ㅡ_ㅡ;;; 해보기 귀찮음.
해보니까 맞는거 같습니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기