[C] 구조체의 char안에 gets가 왜 안 될까요?

kknd345의 이미지

#include<stdio.h>
#include<string.h>


typedef struct schedule{
	int startC;
	int startMin;
	int endC;
	int endMin;
	char contents[255];
};

schedule inputSchedule()
{
	struct schedule exa;


		printf("일정의 시작시:시작분 이렇게 입력해주세요.\n");
		scanf("%d:%d",&exa.startC,&exa.startMin);
		
		if( (exa.startC<10 || exa.startC>=18) || (exa.startMin<0 ||exa.startMin>=60))
		{
			printf("입력오류입니다. 다시 입력해 주세요.\n");
			exa.startC=0;
			return exa;
		}
		
		printf("일정의 끝나는시:끝나는분 이렇게 입력해주세요\n");
		scanf("%d:%d",&exa.endC,&exa.endMin);
		
		if( (exa.endC<10 || exa.endC>18 ) || (exa.endMin<0 || exa.endMin>=60 ))
		{
			printf("입력오류입니다. 다시 입력해 주세요.\n");
			exa.startC=0;
			return exa;
		}
	
	
		printf("일정의 내용을 입력해 주세요\n");
		gets(exa.contents);
		return exa;

}

void main()
{
	struct schedule iljung[100];
	int i;
	
	for(i=0;i<100;i++)
	{

		iljung[i]=inputSchedule();
	
		if(iljung[i].startC==0)/* 입력값에 오류가 있을때 필요한 코드 */
		{				  /*									*/
			i--;		  /*									*/
		}
		printf("%s",iljung[i].contents);

	}
		
}

컴파일 하니 문번적 오류는 없다는데
gets(exa.contents);
일정 입력이 안되네요...
그냥 바로 넘어가버리는데요..

scanf("%s",exa.contents) 했더니 스페이스바를 누르고 입력하니 에러 비슷하게 되길래...
gets를 써볼까하고 바꿧는데
이제 아예 입력을 안 받네요

Rica의 이미지

scanf랑 gets를 섞어 쓰시면 그렇게 됩니다. scanf하고 난 다음에 입력 버퍼에 \n이 남아 있거든요.

리디렉션이나 파이프로 입력받는 경우가 없다면,
gets 직전에 fflush(stdin)을 해주시면 문제가 해결됩니다.

리디렉션/파이프로 입력받을 때 fflush는 입력버퍼를 날려먹는 문제점이 있으므로, 아예 scanf를 쓰지 않고 gets+atoi 를 활용하시면 되겠습니다.

( 이왕이면 gets보다는 fgets( , , stdin) )

ixevexi의 이미지

kknd345의 이미지

scanf와 fgets를 혼용해서 쓰면 상관없나요?

(fgets 는 txt 파일에 남는건 알고 있는데... )

1%의 가능성이면 충분하다!
최선을 다하자!

kknd345의 이미지

atoi 로
10:00

둘을 따로
그러니깐
10 은 a
00 b 에 대입이 가능한가요?

그리고 b=00 하면 컴파일 오류가 안 날까요?

1%의 가능성이면 충분하다!
최선을 다하자!

doldori의 이미지

fgets와 sscanf를 쓰는 게 좋겠네요. 리턴값으로 에러가 있는지도 검사하세요.

#define MAX 100
char s[MAX];
if (fgets(s, MAX, stdin))
{
    int a, b;
    if (sscanf(s, "%d:%d", &a, &b) != 2)
        // invalid input
}
else
    // input error or end-of-file

이렇게 하고 10:00을 입력하면 a는 10, b는 0이 됩니다.

alwaysN00b의 이미지

kknd345 wrote:
atoi 로
10:00

둘을 따로
그러니깐
10 은 a
00 b 에 대입이 가능한가요?

그리고 b=00 하면 컴파일 오류가 안 날까요?

꼭 HH:MM 형식이라면

a = atoi(time);
b = atoi(time+3);

아니라면
간단히
char *divBF(char *buf,char delimeter,int cnt){
	char *temp;
	int i;
	int icnt=0;

	temp = strdup(buf);
	
	for(i=0;i<strlen(buf);i++)
		if(*(buf+i) == delimeter){
			if(cnt == icnt)
				break;
			else 
				temp += i;
		}
		else if(*(buf+i) == NULL) return NULL;
	
	if(cnt > 0) temp++;
	
	for(i=0;i<strlen(temp);i++){
		if( *(temp+i) == delimeter || *(temp+i) == NULL) *(temp+i) = NULL;
	}

	return temp;
	
}

a = divBF(time,':',0);
b = divBF(time,':',1);


급하게 한거라 참고용으로만 보시길.

그리고, man aoti

언제나 시작

죠커의 이미지

Rica wrote:
리디렉션이나 파이프로 입력받는 경우가 없다면,
gets 직전에 fflush(stdin)을 해주시면 문제가 해결됩니다.

ixevexi님이 관련 글을 포워딩 해주셨지만 클릭을 안해 보실 분들을 위해서 적습니다.

fflush(stdin)는 쓰면 안됩니다.

댓글 달기

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