C 기초질문

Nmare의 이미지

c공부하는 학생입니다.
여기다 이런 초보적인 질문 올려도 되는지 모르겠네요..

int main(void)
{
	char buf[50];  //buf 사이즈를 넘겨서 문자열이 들어오면 프로그램 종료됨
	int state;


	FILE* file=fopen("mystory2.txt", "wt");
	if(file==NULL){		//file=NULL이라고 오타치니 실행시 오류 발생.. 정확한 설명을 못함
		puts("file open error! ");
		return 1;		//return 1 하는 이유는? if에서 return 1의 의미는?
	}

	fputs(" 이름을 입력하시오. : ", stdout);
	fgets(buf, sizeof(buf), stdin);
	
	
	fputs("이름 : ", file);
	fputs(buf, file);
	//fputs("\n",file);  //위 문장으로도 \n 문자가 먹어있는 상태던데..

	fputs(" 주소를 입력하시오. : ", stdout);
	fgets(buf, sizeof(buf), stdin);

	fputs("주소 : ", file);
	fputs(buf, file);
	
	fputs(" 주민등록 번호를 입력하시오 : ", stdout);
	fgets(buf, sizeof(buf), stdin);

	fputs("주민등록 번호 : ", file);
	fputs(buf, file);
	
	state=fclose(file);
	if(state!=0)
	{
		printf("file close error! \n");
		return 1;
	}

	return 0;
}

주석 처리한 부분(총 4군데)에 대해 의문점이 있어 질문을 올립니다.

- 1번째 : buf size 부분 -
저는 문자열을 입력받아서 그것을 buf에다 저장시킨후 buf를 파일에다 출력하는 코드입니다.
buf의 크기보다 큰 문자열이 들어오게 되면 그 다음 입력함수 호출시 프로그램이 종료가 됩니다
즉.. buf의 배열 크기가 10이라고 가정했을때
이름은 그냥 3글자로 입력하고
주소 입력시 5글자(한글) 이상을 입력하게 되면
모니터에 "주민등록 번호를 입력하시오"까지 출력이 되고 프로그램이 종료됩니다.
배열의 크기를 넘어가는 문자열이 들어오는게 잘못된거는 알지만
어디서, 왜 에러가 나는건지 정확한 이유를 잘 모르겠습니다.

- 2번째 : if문의 file=NULL -
file=NULL이라고 하고 프로그램을 실행하면
첫번째 출력함수("이름을 입력하시오")가 진행되고 이름을 입력하면
오류가 납니다..
사실 이 문제는 계속 의문을 가졌던 부분인데
if문에서 '=' 연산자와 '=='연산자의 정확한 차이를 모르겠습니다.
여지껏은 일반적으로 쓰는 for문의 i 변수에서
if(i=3)과 if(i==3) 둘다 입력해도 올바른 결과를 출력했었는데
항상 차이점이 뭘까 궁금했었는데 드디어 오늘 문제에 봉착하게 되었습니다.

- 3번째 : return 1의 의미 -
return 1의 의미가 뭔지 모르겠습니다.
if함수가 반환형이 있는건지... 그래서 저 1은 if한테 가는건지..
아니면 main 함수에게 가는건지.. 모르겠습니다.
항상 예제에 나와 있는 메인함수에서 return 0은 무엇을 의미하는건가요?
0이 반환되면 메인 함수의 종료를 의미하는건가요? 아님 아무 값이나 상관없는건가요?

- 4번째 : \n 문자의 상태 -
fputs와 puts함수의 차이점중 하나는 \n문자 라고 배웠습니다.
puts함수는 자동으로 개행문자를 입력된다는 것이었는데
주석이 달린 부분에서
fputs("이름 : ", file); 문장을 호출하고 나면 배운대로 개행문자가 안 먹은 상태이지만
fputs(buf, file); 문장을 호출하고나면 개행문자가 먹은 상태로 되어 있었습니다.
왜 그런 걸까요?

정말 궁급합니다.
답변 부탁드려요..

eminency의 이미지

1. 초과된 입력 부분이 그 다음에 오는 fgets로 전달되기 때문입니다. 이를 방지하려면 fflush를 사용하세요.

2. 사전적으로 말한다면 '='는 대입 연산자이고 '=='는 비교 연산자입니다. '='는 우리가 흔히 아는 equal의 의미가 아니라 '값을 집어넣어라'는 의미입니다.

if (i=3)과 if (i==3)을 비교한다면 처음 문장은 'i에 3을 집어넣고 대입에 문제가 없으면...(?)' 정도의 의미입니다. 대입은 문법적인 오류가 아니면 실패하는 경우가 없다고 보아도 무방하므로 항상 참이 된다고 보아도 될것입니다.
하지만 두번째는 'i가 3이라면...'의 의미이므로 참과 거짓이 명확합니다.

3. if는 함수가 아닙니다(while, for, switch등도 마찬가지입니다). 그러므로 1은 main 함수의 리턴값입니다. 아무값이나 상관없긴 하지만 프로그램 외부에서 프로그램 자체의 종료 반환값이 필요한 경우가 있습니다. main에서 return 하는 값은 그런 경우에 사용됩니다.

4. 제가 알기로 puts랑 fputs는 출력 파일을 지정할 수 있냐 없냐의 차이지(puts는 무조건 stdout) 개행문자랑은 상관없습니다.

fputs("이름 : ",file)에 개행문자가 안 먹은 상태인 이유는 개행문자가 없기 때문이고 fputs(buf, file)에 개행문자가 먹은 이유는 개행문자가 있기 때문입니다(입력시 엔터를 쳐서 \n이 입력된 상태이므로).

이 외에 제가 잘못 지적했거나 미흡한 부분이 있다면 다른 분들이 상세하게 설명해 주실 것입니다. 도움이 되셨길...ㅡ.ㅡ

노루가 사냥꾼의 손에서 벗어나는 것 같이, 새가 그물치는 자의 손에서 벗어나는 것 같이 스스로 구원하라 -잠언 6:5

alone의 이미지

Quote:

2. 사전적으로 말한다면 '='는 대입 연산자이고 '=='는 비교 연산자입니다. '='는 우리가 흔히 아는 equal의 의미가 아니라 '값을 집어넣어라'는 의미입니다.

if (i=3)과 if (i==3)을 비교한다면 처음 문장은 'i에 3을 집어넣고 대입에 문제가 없으면...(?)' 정도의 의미입니다. 대입은 문법적인 오류가 아니면 실패하는 경우가 없다고 보아도 무방하므로 항상 참이 된다고 보아도 될것입니다.
하지만 두번째는 'i가 3이라면...'의 의미이므로 참과 거짓이 명확합니다.

문제가 있군요. if(i=3) 에서의 ()에서의 논리는 3이 되기 때문에 참이고 if(i=0)의 경우는 거짓이 되겠죠... ()의 논리값은 대입되는 값이 됩니다.

내일은 내일일뿐.....

kane의 이미지

puts와 fputs의 근본적인 차이는 FILE을 지정할 수 있느냐지만,
puts는 newline을 덧붙이고 fputs는 newline을 덧붙이지 않는다는 차이점도 있습니다.

ixevexi의 이미지

eminency wrote:
1. 초과된 입력 부분이 그 다음에 오는 fgets로 전달되기 때문입니다. 이를 방지하려면 fflush를 사용하세요.

항상 이 주제가 나오는 군요 -_-;;

결과적으로 잘못되었습니다. fflush를 검색해보세요

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

댓글 달기

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