fgets와 gets의 차이점??

ch0nn0m의 이미지

아래 소스를 보시면 진하게 표시된 fgets부분을 gets로 고치게 되면 remove함수가 제대로 실행이 됩니다

근데 왜 fgets로 하게 되면 잘 안되었을까요?? -_-a


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
 
typedef struct data
{
        char name[20];
        char number[20];
        struct data *next;
}phone;
phone *head, *tail;
void init(void)
{
        head=(phone*)malloc(sizeof(phone));
        tail=(phone*)malloc(sizeof(phone));
        head->next=tail;
        tail->next=tail;
}
void insert()
{
        phone *t;
        t=(phone*)malloc(sizeof(phone));
 
        printf("Input name: ");
        scanf("%s",t->name);
  fflush(stdin);
        printf("Input Tel Number: ");
  scanf("%s",t->number);
  fflush(stdin);
        printf("-------> Data Inserted\n");
 
        t->next=head->next;
        head->next=t;
}
int remove(char *s)
{
 phone *t,*p;
 p=head;
 t=p->next;
 while(strcmp(s,t->name) !=0 && t!= tail)
 {
  p=p->next;
  t=p->next;
 }
 if(t==tail)
  return 0;
 p->next=t->next;
 free(t);
 return 1;
}
void print()
{
 phone *p;
 p=head->next;
 while(p!=tail)
 {
  printf("%s\t%s\n", p->name,p->number);
  p=p->next;
 }
}
 
 
 
int main(int argc,char *argv[])
{
 init();
        int a;
  char buf[20];
        while(1)
        {
                printf("-----Menu-----\n");
                printf("  1. Insert\n");
                printf("  2. Remove\n");
                printf("  3. Search\n");
                printf("  4. Print All\n");
                printf("  5. Exit\n");
                printf("Choose the item: ");
                scanf("%d",&a);
                getchar();
 
                switch(a)
                {
                        case 1: 
                                 insert();
                                 break;
                        case 2: 
                                  printf("삭제할 이름: ");
                                  <span>fgets(buf,20,stdin); //gets(buf)로 고치면 밑의 remove함수가 제대로 실행됨</span>
                                  remove(buf);
                                  break;
                        case 4: 
                                  print();
                                  break;
                }
  }
return 0;
}

crimsoncream의 이미지

man fgets 해서 보시면 fgets와 gets의 newline character를 처리하는게 다르다는 설명을 보실 수 있습니다.
저장한 data는 newline character가 없어서 생기는 문제 같군요.

==========================================================================
오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

오늘 우리는 동지를 땅에 묻었습니다. 그러나 땅은 이제 우리들의 것입니다.
아직도 우리의 적은 강합니다. 그러나 우리는 그들보다 많습니다.
항상 많을 것입니다.

dorado2의 이미지

윗분 말씀대로 fgets로 얻은 데이터에서 new line character를 제거하는 부분을 추가하고 사용하시기 바랍니다.

gets는 사용하지 마세요. 자세한 내용은 man page에 나옵니다~

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.