함수형식 에서 이해가 않되는게 있어서.

min2to의 이미지

함수의 형식중에

예를들어 버퍼를 비우는 작업을할때 쓰는 함수가
fflush라는데여

#include<stdio.h>

int fflush(FILE * SYSTEM)

이런식이 더라구여 그래서 그런데여 FILE * SYSTEM에서
가운데에 *이런기호가 종종 나타나던데 이런건 무엇을
가르키는건가여? 음 포인터를 가르키는건 아닌거같아서.

흠 감사합니다

monpetit의 이미지

jachin의 이미지

포인터 맞아요. :)

메모리에 관련된 부분이라면 포인터는 필수적으로 나옵니다.

파일을 읽고 쓸 때도 메모리와 관련있고, 장치를 제어할 때에도 포인터는 나옵니다.

우리가 보통 사용하는 PC 는 메모리 맵과 관련있기 때문이죠.

포인터를 너무 두려워하지 마시고, 시스템의 메모리 주소를 받아오는 것이라고 생각하세요.

IDNed의 이미지

포인터입니다

반드시 배우셔야 할걸로 사료 -_-

min2to의 이미지

책 보고 그대로 했는데 답이 틀리네여

죄송하지만 어디 부분이 틀린지 알수 없을까여?

실행은 되더라구여 오류도 발견 않하고

(이책은 vc++ 프로그램이고 저는 GCC로 돌린거. )

#include<stdio.h>
                                                                                
int main(void)
{
 char perid[7]; 
 char name[10];
                                                                                
 fputs("주민번호 앞 6자리 입력:",stdout);
 fgets(perid ,sizeof(perid), stdin);
                                                                                
 fflush(stdin);
                                                                                
 fputs("이름을 입력하세요",stdout);
 fgets(name ,sizeof(name), stdin);
                                                                                
 printf("주민번호 앞자리: %s \n",perid);
 printf("이           름: %s \n", name);
                                                                                
                                                                                
                                                                                
return 0;
}
    책의 답은 주민번호 앞 6자리입력 : 이름 입력하세요:
    주민번호 앞자리:
    이 름:

돌려보니까 이름이 입력 않되더라구여 그냥 넘어 가자니 찝찝해서

감사합니다

[/]

모르는건 물어보라구 엄마 아빠가 알려주셧습니다
고수님,선배님들 도와주십쇼 독학하는 학생입니다

IDNed의 이미지

첨에 보자마자 stdin이라는 입력 stream에 플러쉬한다는것 자체부터 이상했습니다 -_-

Quote:
int fflush(FILE* stream);
Flushes stream stream and returns zero on success or EOF on error. Effect undefined for input stream. fflush(NULL) flushes all output streams.

Quote:
int fflush(FILE* stream);
stream 스트림을 비우고 성공시 0을, 에러시 EOF를 반환한다. 입력스트림에 대해서는 "미정의 사항"(undefined)이다. fflush(NULL) 할 경우 모든 출력스트림을 비운다.

출처:http://www.utas.edu.au/infosys/info/documentation/C/CStdLib.html

대략 fflush문을 없애버리면 될겁니다.

이 내용에 의하면 입력스트림에 하는것 자체가 말이 안된다는 의미인듯...

참고로 미정의 사항(undefined)는 TC++PL 번역에서 퍼왔고 이 말은 언어명세에서 정의되지 않았다는 겁니다.

예를 들어 다음과 같은 구문의 결과도 미정의사항입니다.

void func(){
char abc[20];
abc[123]=0;
}

그러니까 쓰지 않는게 좋으실듯...

min2to의 이미지

흠. .

모르는건 물어보라구 엄마 아빠가 알려주셧습니다
고수님,선배님들 도와주십쇼 독학하는 학생입니다

ixevexi의 이미지

fflush로 검색하셨으면 아셨을텐데

fflush를 stdin에 쓰는것은 VS의 익스텐션입니다.

표준이 아니니 쓰지 마세요

책이 VC++책이니 틀린것만은 아니지만
결코 좋다고도 말 못할것 같은데요^^

C++, 그리고 C++....
죽어도 C++

min2to의 이미지

ixevexi wrote:
fflush로 검색하셨으면 아셨을텐데

fflush를 stdin에 쓰는것은 VS의 익스텐션입니다.

표준이 아니니 쓰지 마세요

책이 VC++책이니 틀린것만은 아니지만
결코 좋다고도 말 못할것 같은데요^^

그럼여? 궁금한게 있는데
프로그래밍하는 분들은 GCC,터보,vc++에 대해서
통틀어 아시는분들 인가여? 현재 스트림을 보고 있는데
GCC에선 하나두 않먹히는거 같아서 난감하네여
또한 요즘 대세(?)는 무슨 프로그램인가여 돌리는거

모르는건 물어보라구 엄마 아빠가 알려주셧습니다
고수님,선배님들 도와주십쇼 독학하는 학생입니다

익명 사용자의 이미지

프로그래밍하는 분들은 GCC,터보,vc++에 대해서
통틀어 아시는분들 인가여?

상당수의 프로그래머들은 자신이 익숙한 환경의 동작에만 익숙합니다.

C 표준을 공부하면, 일단은 어디까지가 C의 표준에 의해 이식성이 보장된 부분인지 알게 됩니다.

그 다음에 각각의 컴파일러의 특성에 대해서는 컴파일러의 메뉴얼을 읽어봐야 되겠지요. VC++이면 MSDN, gcc면 gcc manual...

이런 각각의 환경들의 차이점을 반드시 알아야 되는가? 라고 묻는다면 글쎄요... 몰라도 프로그램 잘짜는 사람은 많습니다. 하지만, 만약 알고 있다면 다양한 환경에서도 이식성 문제 없이 동작하는 코드를 만들 수 있는 능력을 갖게 되는 셈입니다. 이런 사람들에게는 일단 C 컴파일러만 있는 환경이라면 도구나 환경이 큰 장애가 되지 못합니다.

굳이 표준을 공부하지 않으시더라도, 해당업체의 제공되는 메뉴얼만 제대로 봐도 많은 것을 건질 수 있습니다. 다음은 MSDN의 fflush 함수의 예제 코드 중의 한 부분입니다.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_fflush.asp

fflush( stdin );   // fflush on input stream is an extension to the C standard

결코 친절한 설명은 아니지만, 어쨌거나 설명을 하고는 있습니다.

익명 사용자의 이미지

fflush(stdin);

위의 코드가 문제가 되는 것은, stdin이 꼭 사용자의 키보드를 통한 입력만을 의미하지는 않기 때문입니다.

유닉스에서 흔히 쓰이는 방법으로, 또는 정보올림피아드 문제 같은 곳에서 데이터를 입력받기 위해 흔히 쓰는 방법으로, 다음과 같은 것이 있습니다.

C:\> program < data.txt

< 기호는 data.txt의 내용을 표준입력을 통해 program으로 보내라는 뜻입니다. 그럼 굳이 사용자가 일일이 data를 키보드로 입력해 줄 필요가 없지요.

사용자가 키보드로 입력을 하고 있는 상태라면, fflush(stdin) 이라는 코드 뒤에 다시 사용자의 키보드 입력을 기다리면 그만입니다. 그러나 만약 위의 사용 방법처럼 파일에서 직접 리다이렉션 해서 데이터를 받고있는 상태라면? 지금까지 처리된 데이터를 제외하고는 싸그리 stdin의 입력 버퍼에서 사라지게 됩니다.

fflush(stdin) 과 같이 입력 스트림에 대해 fflush() 함수를 사용하는 것은, 위의 여러분들께서 지적하신 이식성의 문제 외에도, 위와 같은 문제점이 있습니다.

보통 fflush(stdin) 함수를 사용해야 되는 경우는 scanf 함수를 주의깊게 사용하지 않아 입력버퍼에 공백문자가 남게 되어 문제가 생길 때 입니다. scanf 함수의 동작을 제대로 이해하고 주의깊게 사용하거나, scanf함수 대신 다른 방법(fgets()로 라인을 통째로 입력받는다, sscanf 함수를 사용한다)을 사용함으로써 fflush(stdin) 과 같은 코드를 사용해야 되는 상황을 피할 수 있습니다.

익명 사용자의 이미지

Anonymous wrote:
fflush(stdin);

위의 코드가 문제가 되는 것은, stdin이 꼭 사용자의 키보드를 통한 입력만을 의미하지는 않기 때문입니다.

유닉스에서 흔히 쓰이는 방법으로, 또는 정보올림피아드 문제 같은 곳에서 데이터를 입력받기 위해 흔히 쓰는 방법으로, 다음과 같은 것이 있습니다.

C:\> program < data.txt

< 기호는 data.txt의 내용을 표준입력을 통해 program으로 보내라는 뜻입니다. 그럼 굳이 사용자가 일일이 data를 키보드로 입력해 줄 필요가 없지요.

사용자가 키보드로 입력을 하고 있는 상태라면, fflush(stdin) 이라는 코드 뒤에 다시 사용자의 키보드 입력을 기다리면 그만입니다. 그러나 만약 위의 사용 방법처럼 파일에서 직접 리다이렉션 해서 데이터를 받고있는 상태라면? 지금까지 처리된 데이터를 제외하고는 싸그리 stdin의 입력 버퍼에서 사라지게 됩니다.

fflush(stdin) 과 같이 입력 스트림에 대해 fflush() 함수를 사용하는 것은, 위의 여러분들께서 지적하신 이식성의 문제 외에도, 위와 같은 문제점이 있습니다.

보통 fflush(stdin) 함수를 사용해야 되는 경우는 scanf 함수를 주의깊게 사용하지 않아 입력버퍼에 공백문자가 남게 되어 문제가 생길 때 입니다. scanf 함수의 동작을 제대로 이해하고 주의깊게 사용하거나, scanf함수 대신 다른 방법(fgets()로 라인을 통째로 입력받는다, sscanf 함수를 사용한다)을 사용함으로써 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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.