유닉스에서 만든 간단한 프로그램입니다. 실행이 이상합니다 도와주세요

kkw90111의 이미지

이런 간단한 소스 질문을 여기에 올려도 될지 모르겠네요....
근데 정말 이상한 부분이 없는데 안되서 이렇게 질문 드립니다.
우선 간단한 명함관리 프로그램을 유닉스 환경에서 짜본겁니다
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") );	// 종료문자를 입력 할 때까지 전체 프로그램 반복
kkw90111의 이미지

printf("Set a new name : ");
scanf("%s", card.name);
printf("Set a new phone : ");
scanf("%s", card.phone);

문제되는 지점을 scanf 함수를 사용했더니 요류없이 잘돌아 갑니다...
결국 gets()가 문제였는데 왜 gets 함수를 사용하면 문제가 생기는 건가요.
그것도 다른 부분에서도 gets()함수를 사용해서 문제없이 돌아갔는데 유독 저부분에서 문제가 생긴 걸까요

shint의 이미지

아마 그럴겁니다.

입력 엔터시
아마도. gets는 엔터를 입력 받게 되면 넘어갈겁니다.

그러니까. \n 입력 엔터를 데이터에서 지워줘야 합니다.

다른 방법으로는. fflush(stdin);등으로도 가능한걸로 기억합니다.

아닐지도 모릅니다. ㅡ_ㅡ;;; 해보기 귀찮음.

#include <stdio.h>
#include <memory.h>
 
 
int main(int argc, char* argv[])
{
	char ch[100];
 
	printf("-------------------------\n");
	memset(ch, 0x00, sizeof(ch));
	gets(ch);
	printf("입력받은 값 : %s\n", ch);
 
	printf("-------------------------\n");
	memset(ch, 0x00, sizeof(ch));
	gets(ch);
	printf("입력받은 값 : %s\n", ch);
 
	printf("-------------------------\n");
	memset(ch, 0x00, sizeof(ch));
	scanf("%s", ch);
	printf("입력받은 값 : %s\n", ch);
 
	printf("-------------------------\n");
	memset(ch, 0x00, sizeof(ch));
	fflush(stdin);
	gets(ch);
	printf("입력받은 값 : %s\n", ch);
 
	printf("-------------------------\n");
	memset(ch, 0x00, sizeof(ch));
	scanf("%s", ch);
	printf("입력받은 값 : %s\n", ch);
 
	printf("-------------------------\n");
	memset(ch, 0x00, sizeof(ch));
	gets(ch);
	printf("입력받은 값 : %s\n", ch);
 
	return 0;
}

해보니까 맞는거 같습니다.

----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.

매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.

각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.