C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[22381] 아닙니다!
김백일 [cedar] 1062 읽음    2002-10-31 23:31
JavaForte 님이 쓰신 글 :
: C/C++처음이세요?
: 제가 Java, C++, C, Visual Basic, QBasic, ASP, JavaScript를 해봤는데
: C가 가장 기본이 된다고 생각되네요.
: C가 가장 쉬운 것 같은데 C++가 제일 어렵더군요.

많은 사람들이 C++에 대해서 오해하고 있는 것이 참으로 안타깝습니다.
프로그래밍 언어를 처음 시작하는 사람에게 C는 별로 좋지 않습니다
(다른 관점에서 보면, Java도 마찬가지고요.)
차라리 C++부터 배우는 것이 낫습니다.

제가 C/C++ 자료실에 올린 Bjarne Stroustrup의 글에 있는 예제를 들어보죠.
http://www.borlandforum.com/impboard/impboard.dll?action=read&db=cpp_res&no=17

(지금부터는 프로그래밍을 전혀 모르는 사람의 입장에서 생각해봅시다.)

사용자에게 이름을 입력받고, 그대로 출력하는 간단한 프로그램을 생각해봅시다.

표준 C++이라면 다음과 같이 간단하게 만들 수 있습니다.
아주 직관적이죠? 굳이 설명하지 않아도 쉽게 이해할 수 있을 겁니다.

#include <iostream> // get standard I/O facilities
#include <string>   // get standard string facilities

int main()
{
  using namespace std; // gain access to standard library
  cout << "Please enter your first name: ";
  string name;
  cin >> name;
  cout << "\nHello, " << name << ".\n";
}


C의 경우라면, 다음과 같이 하면 되겠죠?
일단, 입력 받는 문자의 갯수에 제한이 있겠군요.

#include <stdio.h> /* get standard I/O facilities */

/* maximum name length is 19 characters */
#define MAX_LEN 20

int main()
{
  char name[MAX_LEN];

  printf("Please enter your first name: ");
  scanf("%s", name); /* read characters into name */
  printf("Hello, %s.\n", name);

  return 0;
}

초보자가 위 코드를 제대로 이해하기 위해 알아두어야 할 것이 꽤 많습니다.
우선, 전처리기 문장인 #define과, char 배열의 개념입니다.
C의 문자열은 '\0'으로 끝나기 때문에 20 - 1 = 19 문자까지만 저장된다든지,
name은 문자배열의 주소를 나타낸다든지 말이죠.
괴상한 암호 같이 생긴 "%s"도 직관과는 거리가 멀죠.
게다가 위 코드는 완전하지도 않습니다.
만약 scanf로 입력받을 때, 19문자 이상을 입력하게 되면,
name 배열의 크기를 넘어가 버리기 때문에, 프로그램 자체가 죽어버립니다. -_-;;
정말 초보에게는 좌절감만 느끼게 하기 십상이죠.

초보의 좌절감을 해소하기 위해서, 프로그램이 죽어버리는 문제를 해결해보죠.
다음과 같이 scanf의 라인에 '19'만 추가하면 됩니다.

scanf("%19s", name); /* read characters into name */

하지만 이렇게 하면 상수 정의문인
#define MAX_LEN 20
을 써서, 상수 값을 바꾸는 의미가 없습니다. -_-;;

scanf 안의 19도 자동으로 바뀌게 하려면
다음과 같이 수정하면 됩니다.

char fmt[10];
sprintf(fmt,"%%%ds", MAX_LEN - 1);  /* create a format string: plain %s can overflow */
scanf(fmt, name); /* read at most MAX_LEN - 1 characters into name */

이제는 sprintf와 "%%%ds"의 의미도 이해해야 합니다. -_-;;

이 scanf는 아직도 문제가 남아있습니다. name 배열은 19문자까지로 입력이 제한되지만,
실제로 타이핑은 얼마든지 19문자 이상 화면에 계속되고, 그대로 남아있습니다.

게다가 맨 앞에 C++ 코드와 같이, 메모리가 허락하는 범위에서 무제한으로 문자열을
입력받고 출력하는 방법은 도저히 위의 scanf를 사용한 방법으로는 해결할 수 없습니다.

C++ 코드와 완전히 동일하게 동작하는 C 코드를 만드려면
malloc과 realloc를 써서 메모리를 동적으로 할당하고,
scanf대신 getchar를 써서 문자 하나씩 처리를 해야 합니다.
다음은 이를 구현한 코드입니다.

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

#define DEFAULT_LEN 20

void quit();

int main()
{
      int max = DEFAULT_LEN, i = 0, c;
      char *name;

      if ((name = (char *)malloc(max)) == NULL) /* allocate buffer */
            quit();

      printf("Please enter your first name: ");

      while (0) { /* skip leading whitespace */
            int c = getchar();
            if (c == EOF) break; /* end of file */
            if (!isspace(c)) {
                  ungetc(c,stdin);
                  break;
            }
      }

      while (1) {
            c = getchar();
            if (c == '\n' || c == EOF) { /* at end; add terminating zero */
                  name[i] = 0;
                  break;
            }
            name[i] = c;
            if (i == max - 1) { /* buffer full */
                  max *= 2;
                  max = (char*)realloc(name, max); /* get a new and larger buffer */
                  if (name == 0) quit();
            }
            i++;
      }

      printf("\nHello, %s.\n", name);
      free(name); /* release memory */

      return 0;
}

void quit() /* write error message and quit */
{
      fprintf(stderr, "Memory exhausted.\n");
      exit(1);
}


도데체, 이름 하나 입력 받고 그대로 출력하는 데 알아야 될 것이 왜 이렇게 많은지!

C++이 어렵게 느껴지는 것은, 우리가 그 동안 C를 먼저 어렵게 배운 후에,
클래스의 정의부터 시작하는 어려운 C++ 책을 보고 어렵게 배웠기 때문입니다.

이제는 string과 vector와 같은 표준 라이브러리부터 먼저 배우고,
간단하면서도 실용적인 코드를 작성해 본 다음에,
객체지향과 클래스 정의를 배우면 됩니다.

C++을 단기간에 독파할 수 있는 좋은 책으로 Addison-Wesley에서 나온 "Accelerated C++"
을 강추합니다.
와우북에 있는 다음 서평을 참고하세요.
http://www.wowbook.com/computer/book/info/book_detail.asp?isbn=ISBN0-201-70353-X&review=10332#start

: 파일을 만들어 직접 모두입력하는 식으로 해서 배워나가시면 됩니다.
: 회사에서같이 생산성이 중요하면 IDE솔루션을 이용하면 되구요.
:
:
:
: C 입문 님이 쓰신 글 :
: : c언어 배워보려구 하는데여 여기 이렇게 좋은 홈페이지가 있더군여  ^^
: :
: : 터보 C 3.1 하구 C++Builder  중에서 어떤걸 시작해야
: : 쉽게 배울수 있는지 궁금해서요
: :
: : 여기 어디 보니까  첨 시작하는 사람은 C++ 부터 배우는게 좋다는
: : 얘기도 있구해서여
: :
: : 그리구 입문하는데 참고할만한  조언도 부탁드립니다
: : (너무 많은걸 바라는 건가요?... L(- _ -;;  )ㄱ=3=3=3 )
: :
: : 감사합니다...  (__)
: :

+ -

관련 글 리스트
22376 [질문] C언어 첨 배워보려는 생초보입니다 ^^ C 입문 780 2002/10/31
31050     Re:[질문] C언어 첨 배워보려는 생초보입니다 ^^ 국진(Ghost) 796 2002/11/01
31049     Re:[질문] C언어 첨 배워보려는 생초보입니다 ^^ 임형구 836 2002/11/01
22381         아닙니다! 김백일 1062 2002/10/31
22383                 Re:Re:저는 C++을 먼저 시작했는데요. 김백일 856 2002/11/01
22380         Re:Re:[질문] C언어 첨 배워보려는 생초보입니다 ^^ C 입문 835 2002/10/31
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.