콘텐츠로 건너뛰기
Home » C » Page 2

C

C에서의 문자열 배열과 문자열 배열을 동적으로 할당하기

문자열의 배열을 2차원배열을 쓸 때의 문제점

C언어는 문자열을 다루는 자료형이 없다. 대신에  C에서 문자열은 널 문자로 끝나는 문자(char) 타입의 배열을 사용하여 저장한다.  만약 일련의 문자열 집합을 다루려면 문자열의 배열을 써야 할테다.  여러 개의 문자열을 배열에 담고 싶다면 이차원 배열을 쓰는 방법을 생각할 수 있는데,  이 경우 크기가 일정하게 고정된 영역을 여러 개 생성해야 하고, 만약 각 문자열의 길이가 제각각 다르다면 불필요하게 낭비되는 메모리가 제법 될 수 있다.

2차원 배열의 문자열 배열
2차원 배열을 사용하여 구성한 문자열 배열

메모리를 비롯하여, 부족한 하드웨어 자원을 알뜰 살뜰 아껴서 최대의 성능을 내기 위해 개발된 초기 C언어 관점에서 이러한 2차원 배열의 사용은 그리 추천하지 않는다.더 보기 »C에서의 문자열 배열과 문자열 배열을 동적으로 할당하기

[C] conio.h에 대해

conio.h 는 MS-DOS용 C컴파일러에 포함되어 있는 헤더파일로, 표준 C 라이브러리에는 포함되지 않고 있다. (따라서 여기서 정의한 함수를 표준 함수처럼 쓰면 다른 플랫폼에서는 심벌이 없다고 컴파일 되지 않는다.) 이 헤더에는 콘솔 입출력과 관련된 함수들이 정의되어 있다. 멤버 함수들 kbhit – 키보드가 눌려졌는지 확인 getch – 콘솔에서 버퍼나 에코(타이핑한 키가 화면에 표시)없이 한 개의 키 값을 입력 받음 getche – 콘솔에서 키보드 입력으로 한 개의 키 입력을 받음. 에코됨. ungetch – 키보드 버퍼로 문자 1개를 넣음 cgets – 콘솔로부터 문자열을 직접 입력… 더 보기 »[C] conio.h에 대해

[C/C++] 구조체 정보를 디스크에 읽고 쓰는 방법 (2/2)

지난 글에서는 구조체로 정의한 임의의 정보들을 디스크에 기록하는 방법을 예시를 통해 살펴보았다. 그런데 해당 글의 예제는 실제 기록하고 읽어들일 때 사용하는 함수(fread(), fwrite())의 사용법에 초점을 맞추었던 관계로 모든 정보가 구조체 내부에 들어있는 상황을 가정했다. 모든 정보가 구조체 속에 들어있는 상황은 구조체 멤버 중에 포인터가 없는 상황을 말한다. 모든 멤버의 정보는 구조체의 영역 내부에 존재하므로 구조체가 점유하고 있는 메모리 공간은 연속적이다. 따라서 이 경우 해당 구조체의 데이터를 메모리의 다른 어딘가로 복사할 수도 있고, 똑같은 방식으로 파일로 복사할 수도 있다. 바이트를 파일에… 더 보기 »[C/C++] 구조체 정보를 디스크에 읽고 쓰는 방법 (2/2)

[C/C++] 구조체 정보를 디스크에 읽고 쓰는 방법 (1/2)

텍스트가 아닌 애플리케이션의 고유한 데이터를 파일에 기록하는 방법에 대해서 알아보자. 애플리케이션 내에서 정의한 어떤 정보는 다양한 형태와 구조를 가질 수 있기 때문에, 평문 텍스트를 저장하는 것과는 다르다. 이 글에서는 간단한 데이터 타입을 구조체를 통해 정의해보고, 이렇게 만들어진 데이터를 어떻게 디스크에 저장하고 또 다시 불러올 수 있는지에 대해서 알아볼 것이다.

더 보기 »[C/C++] 구조체 정보를 디스크에 읽고 쓰는 방법 (1/2)

[C/C++] 가변인수를 받는 함수

C함수의 가변인수 C함수도 가변인수를 사용할 수 있다. 대표적인 예가 printf이다. printf에는 서식 문자열을 비롯하여 서식에 채워질 값들을 컴마로 연결하여 나열할 수 있다. 이러한 가변인수는 어떻게 만들어서 사용할 수 있는지 살펴보자. 가변인수 함수의 선언 가변 인수 함수는 가변적으로 받을 인수 대신 …을 사용하는 것으로 가변 인수 함수임을 컴파일러에게 알릴 수 있다. 인수에 …이 들어있는 경우 컴파일러는 인수의 개수나 타입에 대해서는 전혀 신경을 쓰지 않게 된다. (결국 이는 함수 구현 시 프로그래머가 일일이 체크해야 하는 부분이다.) 이 때 중요한 것은 고정적으로 사용하는 인수는… 더 보기 »[C/C++] 가변인수를 받는 함수

[C/C++] 이중 연결 리스트

뜬금없이 이중 연결 리스트. 연결 리스트는 여러 개의 노드로 구성된 리스트가 있고, 각각의 노드가 다음 노드로의 링크를 가지고 연결되어 있는 연속적인 데이터 구조이다. 보다 흔히 접하는 연속적인 데이터 구조로는 배열이 있는데, 배열의 경우에는 메모리 상에서 연속된 위치에 데이터가 위치하지만, 연결 리스트는 이러한 구조는 아니고 그저 하나의 노드가 다음 노드를 가리키는 포인터를 가지고 있을 뿐이다. 따라서 리스트의 전체 크기는 중요하지 않고, 중간에 노드를 삽입하거나 빼는 것이 용이하다. 연결리스트를 쉽게 만들기 위해서는 head라는 실제 데이터를 가지지 않는 임의의 노드를 하나 만들어 둘… 더 보기 »[C/C++] 이중 연결 리스트

[혼연C] 단순연결리스트 예제 컴파일이 안돼서…

혼자 연구하는 C/C++의 단순 연결 리스트를 혹시나 싶어서 코딩해봤는데 오류를 뿜으며 컴파일이 안되더라. OSX환경이라 그런 것인지 아니면 이곳의 예제가 C++ 컴파일러여야 하는것인지, 아님 내가 그저 gcc(Apple LLVM)로 컴파일을 해서 문제가 있는 것인지는 모르겠다. 아무튼 구조체 태그를 가지고 새로운 변수를 선언/정의할 때, C에서는 일일이 struct를 붙여줘야 한다. 그냥 데이터 타입처럼 바로 쓰는 건 C++이 허용하는 문법이라고. 그래서 다시 작성함. 도대체 어디가 문제인지 좀 헤맸는데 의외로 엄청 친절하고 꼼꼼한 선생님이 계셨으니… 바로 Xcode… vi로 코딩하다 머리 뜯으며 Xcode로 옮겨보니 바로 알려주시네. 다음… 더 보기 »[혼연C] 단순연결리스트 예제 컴파일이 안돼서…

20111105 :: Learning C – 변수의 종류

아 이거 다 늙어서(?) C언어 공부하려니 훽훽 안돌아가는 내 머리가 원망스러울 따름이고 ㅠㅠ. 어쨌든 이 글은 변수를 설명하는 강좌라기 보다는 C 소스를 볼 때 마법처럼(?) 느껴지는 여러 용어에 대한 이해를 돕기 위한 메모차원의 포스팅 변수 많은 프로그래밍 서적들이 설명하듯이 변수는 어떤 값을 보관하는 상자나 그릇 같은 것이다. 물론 이런 비유는 상당히 시각화하기 쉽기 때문에 이 추상적인 ‘변수’라는 개념을 좀 더 와닿게 느끼게 하는데는 도움을 준다. 다만 조금 더 정확하게 이야기하자면 변수는 특정한 값을 저장하기 위해 마련해 놓은 메모리상의 영역이다. 왜… 더 보기 »20111105 :: Learning C – 변수의 종류