여러분들은 반복되는 숫자 입력을 어떻게 받아들이나요?

junteken의 이미지

먼저 이프로그램의 설명부터 하자면 학생의 시험성적을
입력받아서 그것을 내림차순으로 정렬하는 간단한 프로그램입니다.
간단한 문제로 약간 고민하고 있는데요...
다름이 아니라 밑에 보시면 처음에 들어오는 입력이
i 일때 입력을 받아들이고 q일때 프로그램이 종료되도록까지
프로그래밍 했습니다. 그런데 쪼금 짜증나는 부분이
처음에 이부분을 scanf를 통해서 문자하나를 입력받도록
하였습니다. 이런식으로 하니깐 뒤에 getline에까지 영향이
미치더라구요...scanf에서 읽어들인 \n 요놈때문에
getline도 입력이 되어버린것처럼 실행이 되어버렸습니다.
그래서 다음과 같이 수정하고 다시 프로그램을 돌려보니
이제는입력을 모두 마치고 마지막에 엔터를 친것이
다음입력의 문자부분에 걸려서 이상하게 꼬이네요..
저번에도 scanf때문에 무지 고생했었는데....
헉....이런경우는 보통 어떻게 해결하나요?
답변 부탁드립니다.

struct _Student{
        char *name;
        int kor_score;
        int eng_score;
        int math_score;
        double avrg;
};

void Bubble(struct _Student*, int);

int main(int argc, char **argv)
{
        int i=0, cond_var=1;

        size_t t;

        int size=0;
        char in, trim;
        struct _Student data[BUFFSIZE];

        //input from user in order name, kor_score, eng_score, math_score
        while(cond_var){
                printf("For input - push 'i', For quit - push 'q'\n");

                while( (trim= (char)getchar()) != '\n')
                        in=trim;

                switch(in){
                        case 'i':
                                printf("Input name, korean score, english score, math score\n");
                                printf("name : ");
                                data[i].name= NULL;
                                getline(&data[i].name, &t, stdin);
                                printf("Korean score : ");
                                scanf("%d",&data[i].kor_score);
                                printf("English score : ");
                                scanf("%d", &data[i].eng_score);
                                printf("Math score : ");
                                scanf("%d", &data[i].math_score);

                                data[i].avrg= (double)(data[i].kor_score+ data[i].eng_score+ data[i].math_score)/3.0;
                                size++;
                                break;
                        case 'q':
                                cond_var=0;
                                break;
                         default:
                                printf("You inputed wrong \n");
                                break;
                }
        }

        printf("\nFor debugging\n");
        for(i=0; i< size; i++){
                printf("name= %s, kor_score= %d, eng_score= %d, math_score= %d, avrg= %f\n", data[i].name, data[i].kor_score, data[i].eng_score, data[i].math_score, data[i].avrg);
        }


        return 0;
}

litdream의 이미지

fgets() 를 쓰면 됩니다..
아래 코드가 너무 무성의하다면 죄송..

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

int main() {
        char a[10];

        while ( fgets(a,10,stdin) ) {
                a[ strlen(a) -1 ] = '\0';
                printf("data:%s\n", a);
        }
        return 0;
}

삽질의 대마왕...

dreamer의 이미지

scanf등에는 뒤에 '\n'이 입력 버퍼에 남아 있게 됩니다.
다음을 참고 하세요
http://bbs.kldp.org/viewtopic.php?t=508&highlight=scanf
http://bbs.kldp.org/viewtopic.php?t=400&highlight=scanf
http://bbs.kldp.org/viewtopic.php?t=381&highlight=scanf

좀더 많은 것을 알고 싶으면 scanf로 검색해 보세요

doldori의 이미지

litdream wrote:
        while ( fgets(a,10,stdin) ) {
                a[ strlen(a) -1 ] = '\0';  // (1)
                printf("data:%s\n", a);
        }

(1)은 필요없습니다. fgets가 알아서 해줍니다.
혹시 이런 것을 의도하셨는지도 모르겠군요.
        while ( fgets(a,10,stdin) ) {
                size_t len = strlen(a);
                if (a[len-1] == '\n') a[len-1] = '\0';
                printf("data:%s\n", a);
        }
litdream의 이미지

doldori 님 감사합니다. 저렇게 쓰고 싶었던거 맞습니다..
꾸뻑.

삽질의 대마왕...

musiphil의 이미지

원하시는 바에 따라 다르겠지만, 저렇게 끝의 '\n'을 날려버릴 때는 조심해야 합니다. 입력된 한 줄이 버퍼의 길이보다 길 경우 문자열이 '\n'으로 끝나지 않아서 아직 같은 줄에 읽지 않은 내용이 있다는 것을 판별할 수 있는데, '\n'을 날려버리면 그걸 알 수 없게 되기 때문입니다.

예컨대

char a[8], b[8];
fgets(a, sizeof a, stdin);
fgets(b, sizeof b, stdin);
에 "Hello, World!<Enter>"를 입력으로 주었을 경우
a = {'H' 'e' 'l' 'l' 'o' ',' ' ' '\0'}
b = {'W' 'o' 'r' 'l' 'd' '!' '\n' '\0'}
가 됩니다.

댓글 달기

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