fgets을 이용해서 문자열을 받을때 엔터의 처리?

hurryon의 이미지

리눅스에서...링크스 리스트로 주소록을 하나 만들고 있습니다. 문제는 공백 문자을 입력 받아야 하기 때문에

scanf을 사용하지 않고 fgets을 이용하고 있는데 이것을 이용하니 '엔터' 문자 때문에 고생하고 있습니다.

어디서 들은 봐로 fflush(stdin)을 이용해서 버퍼에 있는 내용을 비우라고 하시는데...제가 제대로 파악을 못했는지

안되네요.

음냐. 소스는 다음과 같습니다. 선배님들은 어떻게 해결을 하셨는지?

 

void add() /* 전화번호부 추가 함수 */ 
{ 
listPtr temp; 
int number; 
char name[MAX_CHAR_0]; 
char telephone[MAX_CHAR_1]; 
char cellphone[MAX_CHAR_1]; 
char address[MAX_CHAR_2]; 
char email[MAX_CHAR_2]; 
char homepage[MAX_CHAR_2]; 

printf("\n-------------------------입력------------------------종료(!)\n"); 

for(;;) /* 포문을 무한으로 돌린다 */ 
{ 
printf("이름: "); 
fgets(name, sizeof(name), stdin); 
fflush(stdin); 

if(name[0] == '!') 
break; 

else 
printf("전화번호: "); 

fgets(telephone, sizeof(telephone), stdin); 
fflush(stdin); 

printf("휴대번호: "); 
fgets(cellphone, sizeof(cellphone), stdin); 
fflush(stdin); 

printf("주소: "); 
fgets(address, sizeof(address), stdin); 
fflush(stdin); 

printf("이메일: "); 
fgets(email, sizeof(email), stdin); 
fflush(stdin); 

printf("홈페이지: "); 
fgets(homepage, sizeof(homepage), stdin); 
scanf("%s", homepage); 
fflush(stdin); 

temp = (listPtr)malloc(sizeof(node)); 

if(IS_FULL(temp)) 
{ 
printf("Error! Full!\n"); 
return; 
} 

strcpy(temp->name, name); 
strcpy(temp->telephone, telephone); 
strcpy(temp->cellphone, cellphone); 
strcpy(temp->address, address); 
strcpy(temp->email, email); 
strcpy(temp->homepage, homepage); 

temp->link = phonebook; 
phonebook = temp; 
} 
} 

음냐. 보니까...엔터까지도 같이 들어 가는거
같습니다. 엔터을 제거 하고 넣어야 할거 같은데..
잘 안되네요.

예을 들어서...

#include <stdio.h> 

main() 
{ 
char name[10]; 
char address[30]; 

int i = 0; 

fgets(name, sizeof(name), stdin); 

for(i = 0; i < 10; i++) 
{ 

fprintf(stdout, "%c", name[i]); 

} 
} 

하고 실행하면 문자가 하나 들어 가더군요.

hurryon
hurryon
?root@note work]#

저걸 어떻게 찾아서 없셀수 있을까요? 아니면
다른 함수로 받아야 하나요?

ihavnoid의 이미지

말 그대로 엔터를 없애면 되겠죠.
\n -> \0 으로 변환해 주면 간단한 해결책이 될 듯 합니다.

뭐 대충 방법을 보이자면...

char * ptr;
for(ptr = the_string; *ptr; ptr++) 
    if(*ptr == '\n') ptr = '\0';

굳이 fflush가 필요하지는 않을 듯 싶습니다.

Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls?
Luke 12:24

cinsk의 이미지

char *
my_gets(char *s, size_t size)
{
  int len;
  fgets(s, size, stdin);
  len = strlen(s);
  if (s[len - 1] == '\n')
    s[len - 1] = '\0';
  return s;
}
ericsong의 이미지

전 아래의 매크로를 사용하고 있습니다.
사용법은
TRIM(문자열)
혹은
TRIM_CRLF(문자열)
입니다.

#define THERE_IS_ALIEN 1

#define TRIM_CRLF(str) if (THERE_IS_ALIEN && str != NULL && str[0] != '\0') { \
		char *__ptr=str+strlen(str)-1;	\
		while( __ptr!= NULL && *__ptr != '\0' && (*__ptr=='\r' || *__ptr=='\n')){	\
		*__ptr='\0'; __ptr--; }	\
}

#define TRIM(str) if (THERE_IS_ALIEN && str != NULL && str[0] != '\0' ) { \
		char *__ptr=str+strlen(str)-1;\
		while( __ptr!= NULL && *__ptr != '\0' && isspace(*__ptr)){\
		*__ptr='\0'; __ptr--; }\
}

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.