728x90

파일 이름을 꺽쇠괄호(<>)대신 큰따옴표로 둘러싸는 것은, 컴파일러에게 그 파일을 표준 헤더파일을 찾는 위치가 지역에서 찾으라고 지시한다. "지역에서 찾는다"의 해석은 그 헤더파일을 소스코드 파일이 있는 디렉토리나 폴더에서, 또는 프로젝트 파일(컴파일러가 이것을 사용한다면)이 있는 디렉토리나 폴더에서 찾으라는 것이다.

 

C는 프로그램을 실행할 때 사용자가 메모리를 할당할 수 있다. 이 작업을 위해 사용하는 주요도구가 malloc()함수이다. malloc() 함수는 하나의 전달인자로 원하는 만큼의 메모리 바이트 수를 사용한다. 그러면 malloc()은 자유 메모리 공간에서 적당한 블록을 찾는다.

 

malloc()은 메모리를 할당하지만 거기에 이름을 붙이지 않는다. 그러나 그 블록의 첫번째 바이트의 주소를 리턴한다. 그러므로 어떤 포인터 변수에 그 주소를 대입할 수 있다. 그 포인터를 사용하여 그 메모리에 접근 할 수 있다.

 

malloc()함수는 배열, 구조체, 기타 등등을 가리키는 포인터를 리턴할 수 있다. 이란적으로 그 리턴값은 데이터형 캐스트를 사용하여 적당한 값으로 변환된다.

 

malloc()은 적당한 메모리 공간을 찾지 못하면 널 포인터를 리턴한다.

 

배열 생성 3가지 방법

1. 배열 크기를 지정하는 상수 표현식을 사용하여 배열을 선언하고, 배열 이름을 사용하여 각 원소에 접근한다.

2. 배열 크기를 지정하는 변수 표현식을 사용하여 가변길이 배열을 선언하고, 배열 이름을 사용하여 각 원소에 접근한다. 이 기능은 자동 메모리 일때만 가능하다.

3. 포인터를 선언하고, malloc()을 호출하고, 포인터에 리턴값을 지정하며, 그 포인터를 사용하여 각 원소에 접근한다. 포인터는 정적일 수도 있고 자동일 수도 있다.

 

일반적으로 malloc()은 free()와 함께 사용해야한다. free()함수는 바로전에 malloc()이 리턴했던 주소를 전달인자로 사용하여, 할당했던 메모리를 해제한다. 그래서, 할당된 메모리의 수명은 malloc()이 호출되어 메모리가 할당된 시점부터 free()가 호출되어 재사용 할 수 있도록 메모리를 해제하는 시점까지다.

 

malloc()과 free()가 메모리 풀을 관리한다고 생각해라. malloc()을 호출 할 때마다 프로그램이 사용할 메모리가 할당되고, free()가 호출될 때 마다 재사용할 수 있도록 메모리가 풀에 반납된다. free()가 사용하는 전달인자는 malloc에 의해 할당된 메모리 블록을 가리키는 포인터여야 한다.

 

배열 선언과 같은, 다른 방법으로 할당된 메모리를 해제하기 위해 free()를 사용할 수 없다. malloc()과 free()는 둘다 stdlib.h 헤더파일에 프로토타입이 들어있다.

 

free()함수는 malloc()이 할당한 메모리를 해제한다. free()함수는 자신의 전달 인자가 가리키는 메모리 블록만을 해제한다.

 

동적 할당 배열을 사용하면 프로그램이 상황에 맞게 크기를 조절할 수 있다.

 

정적 메모리양은 컴파일 될 때 고정된다. 그것은 프로그램이 실행 되는 동안 변하지 않는다. 자동 변수에 의해 사용되는 메모리양은, 프로그램이 자동으로 커졌다 작아졌다 한다. 그러나 할당된 메모리에 의해 사용되는 메모리 양은, 사용자가 free()를 사용하는 것을 잊으면 계속 커진다.

 

메모리를 할당하는 또한가지 방법은 calloc()을 사용하는 것이다. malloc()과 마찬가지로, calloc()도 void형을 가리키는 포인터를 리턴한다. 다른 데이터형을 저장하기를 원한다면 캐스트 연산자를 사용해야한다.

 

calloc()함수는 두개의 전달인자를 사용한다. 그들은 둘다 부호없는 정수값이어야한다. 첫번째 전달인자는 사용자가 원하는 메모리셀의 개수이다. 두번째 전달인잔느 각 셀의 바이트 수이다.

ex) long * newmam;

    newmem = (long *)calloc(100,sizeof(long));

 

calloc()함수는 한가지 특징이 더있다. 이 함수는 할당된 블록의 모든 비트들을 0으로 설정한다. free()함수는 calloc()에 의해 할당된 메모리를 해제하는데에도 사용할 수 있다.

 

가변길이 배열(VLA)는 자동저장 클래스이다. 자동저장 클래스 이기 때문에, 실행이 VLA정의 블록을 탈출할 때 VLA가 사용하는 메모리 공간은 자동으로 해제된다.

 

외부연계, 내부연계, 무연계 정적변수를 위한 메모리영역, 자동변수를 위한 메모리영역, 동적으로 할당되는 메모리 영역 이렇게 세가지 영역으로 사용가능한 메모리를 프로그램이 나눈다고 생각할 수 있다.

 

정적 수명 저장 클래스들에 필요한 메모리양은 컴파일 될 때 결정된다. 그리고 이영역에 저장되는 데이터는 프로그램이 실행되는 동안 계속 사용할 수 있다. 이 저장 클래스에 속하는 변수는, 프로그램이 시작될 때 생성되고 프로그램이 종료될 때 소멸한다.

 

자동변수는, 프로그램이 그 변수의 정의를 포함하고 있는 코드 블록에 진입할 때 생성되고, 프로그램이 그 코드 블록을 탈출할 때 소멸된다. 그러므로 프로그램이 함수들을 호출 할 때 그리고 함수들이 종료될 때, 자동 변수들이 사용하는 메모리양은 커졌다 작아졌다 한다. 일반적으로 이 메모리 영역은 스택으로 처리된다. 이것은 새로운 변수들이 생성되는 순서대로 메모리에 추가되고, 소멸 될때는 반대순서로 소멸된다는 것을 의미한다. FILO

 

보통 프로그램은 정적 객체들, 자동 객체들, 동적으로 할당된 객체들을 위한 메모리 영역을 서로 다르게 사용한다.

 

문자열 리터럴을 포함하는 정적 데이터는 한 영역을, 자동 데이터는 두번째 영역을, 동적으로 할당된 데이터는 세번째 영역을(메모리 힙, 프리스토어 라고 불린다.) 차지하고 있다.

728x90

'Programming > C' 카테고리의 다른 글

rand, srand 코드  (0) 2019.06.01
C언어 공부 24  (0) 2019.05.31
C언어 공부 22  (0) 2019.05.31
C언어 공부 21  (0) 2019.05.30
C언어 오목 만들기  (0) 2019.05.29
728x90

C는 범위, 연계, 수명을 사용하여 블록범위를 가지는 자동, 레지스터, 무연계 정적 저장 클래스와, 파일 범위를 가지는 외부 연계 정적과 내부연계 정적이라는 다섯가지의 저장 클래스를 정의한다.

 

저장클래스             수명             범위          연계                                    선언방법

자동                     자동             블록           없음                         블록안에

레지스터               자동             블록           없음                        블록안에 키워드 register로

정적 외부연계        정적              파일          외부                        모든 함수들의 바깥에

정적 내부연계        정적              파일          내부                        모든 함수들의 바깥에 키워드 static으로

정적 무연계           정적              블록          없음                         블록안에 키워드 static으로

 

자동 저장 클래스에 속하는 변수는 자동 수명, 블록 범위, 무연계를 가진다.

블록안에 또는 함수 머리 안에 선언된 변수는 기본적으로 자동 저장 클래스에 속한다. 그러나 프로그래머의 의도를 확실하게 하기 위해 키워드 auto를 명시적으로 사용할 수 있다.

 

블록 범위와 무연계라는 것은, 그 변수가 정의된 블록 안에서만 이름을 통해 그 변수에 접근할 수 있는 것을 의미한다.

 

자동저장 수명의 경우에, 변수 선언이 들어있는 블록에 프로그램이 진입할 때 변수가 생성된다는 것을 상기하라. 프로그램이 블록을 탈출 할 때 자동 변수는 소멸된다. 이제 그 메모리 위치는 다른용도로 사용될 수 있다.

 

일반적으로 변수는 컴퓨터 메모리에 저장된다. 운이 좋은 레지스터 변수들은, CPU 레지스터에 또는 좀더 일반적으로 사용할 수 있는 가장 빠른 메모리에 저장된다.

레지스터 변수는 블록범위, 무연계, 자동수명을 가진다. 레지스터 변수는 저장클래스 지정자 register를 사용하여 선언한다.

 

정적변수(static variable)라는 이름은, 마치 변할 수 없는 변수를 의미한 것 같아 모순처럼 들린다. 그러나 정적(static)이라는 말이 실제로 의미하는 것은, 변수가 메모리에 그대로 유지된다는 것을 의미한다.

 

static 즉 정적 변수는 컴파일 될 때 단 한번만 초기화 된다. 디버거를 사용하여 프로그램을 한단계씩 실행시켜보면 프로그램이 그 단계를 건너 뛰는 것을 볼 수 있다. 프로그램이 적재된 후에는 정적 변수와 외부 변수들이 이미 자리를 차지하고 있기 때문이다.

 

외부연계 정적 변수는 파일 범위, 파일범위, 외부연계, 정적 수명을 가진다. 이 저장클래스를 때로는 외부저장 클래스(external storage class)라고 부르고, 이 유형의 변수들은 외부 변수(external vriable)라고 부른다. 외부 변수는 어떤 함수에도 속하지 않게 함수의 외부에 정의 선언을 놓음으로써 생성한다.

 

외부 변수는 키워드 extern을 사용하여 그 변수를 사용하는 함수 안에 추가로 재선언 할 수 있다. 그 변수가 다른 파일에 정의되어 있다면, 그 변수는 반드시 extern 키워드로 선언해야 한다. 특정 외부 변수가 한 소스코드에 저으이되어 있고 두번째 소스코드 파일에 사용된다면, 반드시 두번째 파일에 extern으로 변수를 선언해야한다.

 

외부 변수는 사용자가 초기화 하지 않으면 자동으로 0으로 초기화된다.

 

외부 정의를 생성하려면 키워드 extern을 사용하면 안된다. 이미 존재하는 외부 정의를 참조하는 용도로만 extern을 사용해야 한다. 외부 변수는 단한번만 초기화 할 수있다. 그 초기화는 변수가 저으이될 때 이루어 져야한다.

키워드 extern은 어디에 있는지 찾아보라고 컴파일러에게 지시하는것이다.

 

내부연계 정적 변수는 정적 수명, 파일 범위, 내부연계를 가진다. 이 변수는, 어떤 함수에도 속하지 않고 함수들의 바깥에 저장 하며 클래스 지정자 static을 사용하여 정의한다.

 

하나의 파일에서 정의된 외부 변수는, 다른 파일에서 (extern을 사용하여)선언하지 않는한, 다른 파일에서 사용할 수 없다. 외부 선언 자체는 다른 파일들이 잠재적으로 그 변수를 사용할 수 있도록 만들 뿐이다.

 

함수들도 저장 클래스를 가진다. 함수는 외부(디폴트) 또는 정적 둘중 하나를 가질 수 있다. 외부함수는 다른 파일에 들어 있는 함수들이 사용할 수 있다. 그러나 정적 함수는 그 함수가 정의된 파일에 들어 있는 함수들 만이 사용할 수 있다.

 

함수에 static 저장 클래스를 사용하는 한가지 이유는, 함수들을 특정 모듈에만 사용할 수 있게 만들어 이름들이 충돌할 가능성을 피하는 것이다.

 

C라이브러리는, 난수들을 발생시키는 rand()라는 함수를 제공한다. rand()함수는 '종자값(seed)'를 사용하여 새로운 수를 만든다. 그 수가 새로운 종자값이 된다. 그러고 나서 새로운 종자값은 더 새로운 종자값을 만든다.

위 설계가 제대로 동작하려면, 난수함수는 바로 이전의 호출에서 사용한 종자값을 기억해야 한다.

 

 

728x90

'Programming > C' 카테고리의 다른 글

C언어 공부 24  (0) 2019.05.31
C언어 공부 23  (0) 2019.05.31
C언어 공부 21  (0) 2019.05.30
C언어 오목 만들기  (0) 2019.05.29
C언어 공부 20  (0) 2019.05.29
728x90

C는 데이터를 메모리에 저장하기 위해 변수들을 서로다른 다섯가지의 기억 모델, 즉 저장 클래스(storage class)를 제공한다.

 

저장된 각 값은 물리적인 메모리를 차지한다. C학문은 그런 메모리 덩어리에 대해 객체(object)라는 용어를 사용한다.

한 객체에는 하나 또는 그 이상의 값들을 저장해야 한다.

 

프로그램은 객체에 접속하는 방법을 필요로 한다. 이것은 예를 들어 변수를 정의함으로써 수행된다.

 

저장기간 또는 저장 수명(storage duration)이라는 용어로 객체를 설명한다면, 어라마나 오랫동안 메모리에 유지될 수 있는지를 나타낸다.

 

범위(scope)와 연계(linkage)로 객체를 접속하는데 사용된 식별자를 설명한다면, 이들은 함께한 프로그램의 어떤 부분들이 그것을 사용할 수 있는지를 정한다. 저장 클래스에 따라 범위, 연계, 저장기간의 다른 조합이 만들어진다.

 

프로그램의 수명과 운명을 같이하는 변수와, 자신이 포함된 함수가 실행중일 동안에만 존재하는 객체가 있다. 그리고, 특정 스레드(thread)기간 동안에만 존재하는 오브젝트도 있다.

 

범위(scope) : 프로그램이 어떤 식별자에 접근할 수 있는 영역을 나타낸다. C의 변수는 블록 범위, 함수 프로토 타입 범위, 파일 범위중 어느 한가지 범위를 가진다.

 

정의가 어떤 함수에도 속하지 않고 함수들의 바깥에 놓여 있는 변수는 파일 범위를 가진다.

 

C의 변수는 외부연계(external linkage), 내부 연계(internal linkage), 무연계(no linkage)중 어느 하나를 가진다. 블록 범위 변수나 함수 범위 변수, 즉 함수 프로토 타입 범위 변수는 연계를 가지지 않는다. 이말은, 그들이 정의된 블록이나 함수, 즉 프로토 타입에만 적용된다는 뜻이다.

 

파일범위 변수는 내부 연계나 외부 연계중 어느하나를 가질 수 있다. 외부 연계를 가지는 변수는, 다중 파일 프로그램의 어디에서나 사용할 수 있다. 내부연계를 가지는 변수는 한 파일 안의 어디에서나 사용할 수 있다. 파일 범위 변수들은, 하나 이상의 함수에서 사용할 수 있기 때문에, 전역 변수라고도 부른다.

 

ex)

int abc = 5;               //파일 범위, 외부연계

static int def = 6;       //파일 범위, 내부 연계

 

int main()

{

       ......

}

 

외부연계 : 여러 파일로 구성된 프로그램의 어디에서나 사용될 수 있다.

내부 연계 : 하나의 파일안의 어디에서나 사용될 수 있다.

무연계 : 블록 범위 변수나 프로토 타입 범위 변수는 연계를 가지지 않는다.

 

저장수명은 식별자들로 접속하는 객체들의 지속성을 나타낸다. C객체는 다음 네가지 수명(정적 수명(static duration), 스레드 수명(thread duration), 자동 수명(automatic duration), 할당된 수명(allocated duration))중 한가지를 갖고 있다.

 

정적 수명을 갖는 객체는 프로그램이 실행되는 동안에 내내 존재한다. 파일범위 변수에 대해서 키워드 static은 수명이 아니라 연계유형을 나타낸다. static을 사용해 선언된 한 파일 범위 변수는 내부 연결을 갖지만, 내부 연결이나 외부 연결을 사용한 모든 파일 범위 변수들은 정적 수명을 갖는다.

 

스레드 수명은 프로그램 실행이 여러 스레드로 분할 될수 있는 동시 프로그래밍으로 실행하게 된다. 스레드 수명은 그것이 선언되었을 때부터 스레드가 종료될 때까지 존재한다. 그러한 객체는 파일 범위 객체가 선언되거나 그렇지 않으면 키워드 _Thread_local 로 수정되는 파일 범위 객체가 만들어지든가 할 때 만들어진다.

 

블록 범위 변수는 일반적으로 자동 수명을 가진다. 일반적으로 블록범위 변수들은, 그들이 정의된 블록에 프로그램이 진입할 때 메모리가 할당되고, 프로그램이 블록을 탈출 할 때 메모리가 해제된다. 예를 들어, 하나의 함수 호출이 종료되었을 때, 그 함수의 변수들이 사용했던 메모리는 다음번에 호출된 함수의 변수들에 의해 사용될 수 있다.

 

지역 변수들은 모두 자동수명을 가진다. 그러나 변수는 블록범위를 갖는 동시에 정적인 수명을 가질 수 있다. 이러한 변수를 만들려면 블록안에서 선언하고 키워드 static을 선언에 추가한다.

728x90

'Programming > C' 카테고리의 다른 글

C언어 공부 23  (0) 2019.05.31
C언어 공부 22  (0) 2019.05.31
C언어 오목 만들기  (0) 2019.05.29
C언어 공부 20  (0) 2019.05.29
C언어 공부 19  (0) 2019.05.29
728x90

16 x 16판 좌표 입력 오목 

6돌 이상감지

728x90

'Programming > C' 카테고리의 다른 글

C언어 공부 22  (0) 2019.05.31
C언어 공부 21  (0) 2019.05.30
C언어 공부 20  (0) 2019.05.29
C언어 공부 19  (0) 2019.05.29
C언어 공부 18  (0) 2019.05.29
728x90

C라이브러리는 qsort()라는 좀더 진보된 정렬 함수를 제공한다.

 

ispunct() : 입력된 문자가 구두문자인지 아닌지를 판단합니다. 숫자와 알파벳 공백을 제외한 출력가능한 구두 문자일 때 true 반환

 

C 컴파일러는 main()이 전달인자를 전혀 사용하지 않거나, 두개의 전달인자를 사용하는 것을 허용한다. main
()이 두개의 전달인자를 사용할 때, 첫번째 전달인자는 명령행에 있는 문자열의 개수다. 이 첫번째 int형 전달인자를 argc라고 부른다. argc는 argv의 개수다.

 

프로그램은 메모리에 있는 명령행 문자열을 저장하고 포인터 배열에 있는 각 문자열 주소를 저장한다. 관례상 이 포인터들의 배열을 argv라고 한다. argv[0]는 프로그램 이름 자체가 대입된다. 그러고 나서 argv[1]은 그 다음에 오는 첫번째 문자열이 대입된다.

 

argv는 char형 포인터를 가리키는 포인터이다.

 

인자로 넣어주면 명령행 전달인자들은(argv) 문자열로 읽혀진다. 그러므로 수치값을 사용하려면, 먼저 문자열을 수로 변환해야한다. 그 수가 정수라면, alphanumeric to integer를 의미하는 atoi()함수를 사용할 수 있다.

atoi()함수는 문자열을 전달인자로 받아들여, 그것에 해당하는 정수값을 리턴한다.

 

문자열이 정수로 시작되는 문자열이라면 atoi()함수는 동작한다. 그런 경우에, atoi()는 정수 부분이 아닌 것을 만날 때까지 그 앞의 문자들만 변환한다.

ex) atoi("42regular")는 정수 42를 리턴한다.

 

atoi() 함수 선언은 stdlib.h에 들어가 있다. 또한 이 헤더파일은 atof()와 atol()의 함수 선언도 가지고 있다. atof()함수는 문자열을 double형 값으로 변환한다. atol()함수는 문자열을 long값으로 변환한다. 이 함수들은 atoi()함수와 비슷하게 작동한다.

 

strtol() : 문자열을 long형으로 변환한다.

strtoul() :문자열을 unsigned long으로 변환 한다.

strtod() : 문자열을 double형으로 변환한다.

 

이함수들은 문자열에서 수가아닌 첫번째 문자를 인식하고 보고한다는 것이다. 또한, strtol()과 strtoul()은 진수의 기수(number base)를 지정하는 것도 허용한다.

 

strtol()의 프로토 타입

long strtol(const char * nptr, char **endptr, int base);

여기서 nptr는 변환하기를 원하는 문자열을 가리키는 포인터다. endptr은 포인터의 주소다. 그 포인터는 입력한 수를 끝내는 문자, 즉 수가아닌 부분의 첫번째 문자의 주소로 설정된다. base는 그 수를 표기할 진수의 기수다.

 

strtol()함수는, 알파벳 'z'까지를 숫자(digit)로 사용하여, 36진수까지 처리 할 수 있다. strtoul()함수는 부호 없는 값으로 변환한다. strtod() 함수는 10진수만 처리한다.

 

C의 문자열은 문자 코드들을 가지는 연속된 바이트 들로 저장된다. 이 시퀀스는 널 문자로 끝난다. C는 문자열을 조작하고, 검색하고, 분석할 수 있는 유용한 문자열 처리 함수들의 라이브러리를 제공한다.

 

문자열을 비교할 때는 관계연산자가 아니라 strcmp()를 사용해야 한다는 것과, 문자열을 문자 배열에 대입할 때에는 대입연산자가 아니라 strcpy()나 strncpy를 사용해야 한다는 것을 기억해야한다.

 

strlen()함수를 사용하여 문자열 길이를 구할 때, 널문자는 카운터 되지 않는다.

 

함수들은 조작할 문자열을 지정하기 위해 그 문자열의 첫번째 문자를 가리키는 포인터를 사용한다. 일반적으로, 그에 해당하는 실 전달인자로 배열 이름, 포인터 변수, 큰 따옴표로 둘러싼 문자열을 사용할 수 있다. 어느 경우에나 첫번째 문자의 주소가 전달된다.

 

함수 atoi(), atol(), atof()는 문자열로 표현된 수를 int형, long형, double형 값으로 각각 변환한다. 함수 strtol(), strtoul(), strtod()는 문자열로 표현된 수를 long형, unsigned long형, double형으로 각각 변환한다.

728x90

'Programming > C' 카테고리의 다른 글

C언어 공부 21  (0) 2019.05.30
C언어 오목 만들기  (0) 2019.05.29
C언어 공부 19  (0) 2019.05.29
C언어 공부 18  (0) 2019.05.29
C언어 공부 17  (0) 2019.05.29
728x90

자주 사용되는 문자열 함수들

 

char * strcpy(char * restrict s1, const char * restrict s2);

s2가 가리키는 문자열(널 문자 포함)을 s1이 가리키는 위치에 복사한다. 리턴 값은 s1이다.

 

char * strncpy(char * restrict s1, const char * restrict s2, size_t n)

s2가 가리키는 문자열로 부터 복사한계 n개까지 문자들을 s1이 가리키는 위치에 복사한다. 널 문자 이후의 문자들은 복사되지 않는다. 소스 문자열이 n보다 짧을 경우, 타깃 문자열의 나머지 부분은 널 문자로 채워진다. 소스 문자열이 n이거나 그보다 길 경우, 널 문자는 복사되지 않는다. 리턴값은 s1이다.

 

int strcmp(const char * s1, const char * s2);

이 함수는, s1문자열이 s2문자열보다 기계조회 순서로 뒤에오면 양수를, 동일하면 0을, 앞에오면 음수를 리턴한다.

 

int strncmp(const char * s1, const char * s2, size_t n);

이 함수는, n개의 문자열들 까지만 또는 첫번째 널 문자를 만날 때 까지만 비교한다. 둘중 먼저 일어나는 것을 수행한다. 나머지 사항은 strcmp()와 같다.

 

char * strchr(const char *s, int c);

이함수는, 문자열 s에서 문자 c가 처음으로 나타나는 위치를 가리키는 포인터를 리턴한다.(종결 널문자는 문자열의 일부다. 그래서 널문자도 찾는 대상이 될 수 있다.) 이 함수는 문자 C를 찾지 못했을 때 널 포인터를 리턴한다.

 

char *strpbrk(const char * s1, const char * s2);

이 함수는, 문자열 s2에 들어있는 문자들중 어떤 문자가 문자열 s1에서 처음으로 나타나는 위치를 가리키는 포인터를 리턴한다. 이 함수는 어떤 문자도 찾지 못했을 때 널 포인터를 리턴한다.

 

char * strrchr(const char * s, int c);

이함수는, 문자열 s에서 문자 c가 마지막으로 나타나는 위치를 가리키는 포인터를 리턴한다.(종결 널문자는 문자열의 일부다. 그래서 널 문자도 찾는 대상이 될 수 있다.) 이 함수는 문자 c를 찾지 못했을 때 널 포인터를 리턴한다.

 

char * strstr(const char * s1, const char * s2);

이함수는, 문자열 s1에서 문자열 s2가 처음으로 나타나는 위치를 가리키는 포인터를 리턴한다. 이 함수는 문자열 s2를 찾지 못했을 때 널 포인터를 리턴한다.

 

size_t strlen(const char * s);

이함수는 문자열 s에서 찾은 문자들의 개수를 리턴한다. 이 때 종결 널문자는 포함하지 않는다.

728x90

'Programming > C' 카테고리의 다른 글

C언어 오목 만들기  (0) 2019.05.29
C언어 공부 20  (0) 2019.05.29
C언어 공부 18  (0) 2019.05.29
C언어 공부 17  (0) 2019.05.29
프로그래밍 연습 7  (0) 2019.05.12
728x90

s_gets() : 문자열로 표현되면 개행문자를 널문자로 교체하고 그렇지 않으면 행의 나머지 부분을 버린다.

 

scanf(format) : 화이트 스페이스가 아닌 첫 문자부터 문자열을 시작한다. %s 포맷을 사용하면, 다음 화이트 스페이스문자 까지가 그 문자열에 해당한다. 성공적으로 읽은 항목의 개수에 해당하는 정수값을 리턴한다. 파일의 끝을 만났을 경우에는 EOF를 리턴한다.

 

puts() : 널문자를 만났을 때 멈춘다. 널문자가 없는 문자배열을 출력하면 널문자를 만날 때 까지 그 뒤의 메모리 내용을 계속 출력한다.

 

fputs() : puts()함수의 파일 지향 버전이다. puts()와는 달리, fputs()는 출력에 개행을 자동으로 추가하지 않는다. fputs() 함수는 출력할 타깃 파일을 지정하기 위해 두번째 전달인자를 사용한다. 표시 장치에 대한 출력인자로 stdout을 사용할 수 있다.

 

strlen() : 문자열의 길이를 구한다.

 

strcat() : 두개의 문자열을 전달인자로 사용한다. 두번째 문자열의 복사본이 첫번째 문자열의 뒤에 덧붙는다. 결합된 문자열이 새로워진 첫번째 문자열이 된다. 두번째 문자열은 변경되지 않는다. strcat 함수는 char *형이다. 첫번째 전달인자의 주소를 리턴한다.

 

strncat() : 이 함수는 추가할 문자 개수의 최대값을 지정하기 위해 두번째 전달인자를 사용한다.

ex) strncat(bugs, addon, 13)

addon 문자열의 내용을 bugs에 추가한다. 추가하는 문자 개수가 13개에 도달하거나 널 문자를 만나면 추가를 멈춘다.

 

strcmp() : 두 문자열 전달인자가 같으면 0, 같지않으면 0이아닌 숫자를 리턴한다. 문자열 내용을 비교한다. 첫번째 문자열이 두번째 문자열보다 알파벳 순서로 앞에오면 음수를 리턴하고, 뒤에 오면 양수를 리턴한다. 대문자들의 코드가 소문자들의 코드보다 앞에온다. 대응하는 두 문자가 일치하지 않는 문자 쌍을 찾을 때까지 문자열들을 비교한다.

 

strncmp() : 일치하지 않는 문자 쌍을 만날 때까지 또는 세번째 전달인자로 지정한 문자들의 개수 까지만 문자열들을 비교한다.

 

strcpy() : 두개의 문자열 포인터를 전달인자로 사용한다. 선언된 포인터, 배열이름, 문자열 상수가 소스문자열을 가리키는 두번째 포인터가 될 수 있다. 타깃 문자열을 가리키는 첫번째 포인터는, 그 문자열을 저장할 수 있을 만큼 충분한 기억 공간을 확보하고 있는, 배열과 같은 데이터 객체를 가리켜야한다.

 

배열을 선언하면 데이터를 위한 기억공간이 할당되고, 포인터를 선언하면 하나의 주소를 위한 기억공간이 할당된다.

 

strcpy() 는 char * 형이다. strcpy()는 첫번째 전달인자 문자의 주소를 리턴한다. 또한 첫번째 전달인자가 반드시 배열의 시작을 가리킬 필요는 없다. 이것은 배열의 일부만 복사할 수도 있다는 것을 의미한다.

 

strncpy() : 복사할 최대 문자개수를 지정하는 세번째 전달인자를 사용한다. 복사할 문자열의 문자들의 개수가 최대 문자개수보다 작으면 널문자를 포함하여 전체 문자열이 복사된다.

 

sprintf() : 첫번째 전달인자는 타깃 문자열의 주소이다. 나머지 전달인자들은 printf()와 동일하다. 즉 포맷 문자열이 먼저 나오고, 출력할 항목들의 리스트가 뒤따른다. 나머지 항목들을 결합하여 첫번째 전달인자에 저장 한다. sprintf()는 결과로 만들어지는 문자열을 디스플레이에 출력하지 않고 첫번째 전달인자에 저장한다.

 

728x90

'Programming > C' 카테고리의 다른 글

C언어 공부 20  (0) 2019.05.29
C언어 공부 19  (0) 2019.05.29
C언어 공부 17  (0) 2019.05.29
프로그래밍 연습 7  (0) 2019.05.12
프로그래밍 연습 6  (0) 2019.05.12
728x90

문자열과 문자열 함수

 

C라이브러리는 문자열 읽기, 문자열 쓰기, 문자열 복사, 문자열 비교, 문자열 결합, 문자열 검색 등과 같은 광범위한 함수들을 제공한다.

 

문자열(character string)은 널 문자(\0)로 끝나는 char형 배열이다.

 

문자열을 정의하는 기본적인 방법은 문자열 상수, char형 배열, char형 포인터, 문자열 배열을 사용하는 것이다.

 

큰따옴표로 둘러싸인 문자들은, 컴파일러가 자동으로 삽입하는 종결 널문자 \0까지 포함하여, 메모리에 문자열로 저장된다.

 

C는 문자열 리터럴들 사이에 아무것도 없거나 화이트 스페이스가 들어 있으면 그문자열 리터럴들을 하나로 결합한다는 것을 상기하라.

ex) char greeting[50] = "Hello and,""how are" "you" "today!";

위 선언은 다음과 같이 선언하는 것과 동등하다.

char greeting[50] = "Hello, and, how are you today!";

문자열 상수는 큰따옴표로 둘러싼 모든것이다.

 

문자열 상수는 정적 저장 클래스(static storage class)로 저장된다. 이것은, 함수안에서 문자열 상수를 사용하면, 그 함수가 여러번 호출 되더라도, 그 문자열이 단 한번만 저장되어 프로그램이 실행되는 동안 지속적으로 유지된다는 것을 의미한다.

 

종결 널문자('\0')가 없으면 문자열이 아니라 문자 배열이 된다.

 

일반적으로, 큰 따옴표로 둘러싸인 문자열은 실행파일의 일부인 데이터 세그먼트에 저장된다. 프로그램이 메모리에 적재될 때 그 문자열도 함께 적재된다. 이때 큰따옴표로 둘러싸인 문자열은 정적 메모리(static memory)에 있다고 말한다. 그러나 그 배열을 위한 메모리 할당은 프로그램의 실행이 시작된 이후에 이루어진다.

 

정적인 데이터에 사용되는 메모리는 동적메모리에 사용되는것과 다르다.

 

배열의 원소(element)들은 변수이다. 그러나 배열의 이름은 변수가 아니다.

 

문자열을 고치거나 문자열 입력을 위한 공간을 확보하기 원한다면 포인터 배열이 좋다.

 

문자열을 프로그램 안으로 읽어들이려면, 그문자열을 저장할 수 있는 기억공간을 먼저 할당하고, 문자열을 읽는 입력 함수를 사용해야 한다.

 

gets() : 개행 문자에(\n) 도달할 때까지 한 줄을 전부 읽고 개행문자를 제거하고 C문자열을 만들기위해 널문자(\0)를 추가하여 남은 문자를 저장한다.

 

puts(word) == printf("%s\n",words)

 

gets()는 배열이 어디서 시작하는지만 알 뿐 원소가 몇개 있는지는 모른다.

 

세그멘테이션 오류(segmentation fault) : 프로그램이 할당되지 않은 메모리에 접속하려고 할 때 뜬다.

 

fgets() : 읽을 문자열의 최대 개수를 지정함으로써 오버플로 문제를 해결한다. 읽을 문자들의 최대 개수를 지정하기 위해 두번째 전달인자로 사용한다. 그 전달인자 값이 n이라면 fgets()는 n-1개까지 문자들을 읽거나 개행문자가 나올때까지 읽는다. fgets()는 개행문자를 읽어 그 문자열에 저장한다. gets()는 개행문자를 읽고 그냥 버린다.(널문자 삽입) 

어느 파일을 읽을 것인지 지정하기 위해 세번째 전달인자를 사용한다. 키보드로 부터 읽으려면 stdin을 전달인자로 사용한다.

 

fputs()는 출력 끝에 개행을 추가하지 않는다.

 

fgets()함수는 char로 포인터를 리턴한다. 문제가 없다면 첫번째 전달인자로서 보내졌던 것과 같은 주소로 리턴한다. 그러나 파일 끝을 만나면 널포인터(null pointer)라는 특별한 포인터를 리턴한다. 널포인터는 특별한 경우를 가리키는데 사용될 수 있도록 유효한 데이터를 가리키지 않도록 보증된 포인터이다.

 

시스템은 버퍼를 사용하는 I/O(buffered I/O)를 사용한다. 이것은 입력이 리턴키가 눌러질 때 까지 임시 메모리(버퍼)에 저장된다는 의미이다.

 

널 포인터,즉 NULL은 데이터의 유효한 주소에 해당하지 않는 값을 갖는다. 널포인터는 종종 파일 끝을 만나거나 또는 예상했던 대로 실행하는데 실패하는 것과 같은 일부 특별한 발생을 나타내기 위해 유효주소를 반환하는 함수에서 종종 사용된다.

gets_s( ) 함수는, fgets()함수처럼 전달인자가 읽는 문자수의 한계를 사용한다.(읽는 최대 문자수)

 

gets_s( )

1. 표준 입력만 읽어 세번째 전달인자가 필요없다.

2. 개행을 읽는 경우 개행문자를 저장하는 대신 버린다.

3. 문자를 최대치까지 읽고 개행을 읽는데 실패했다면 몇단계를 거친다. 목표 배열의 첫번째 문자를 널문자에 맞추어 놓는다. 개행 또는 파일끝(end -of -file)을 만날때 까지 그것을 읽고 이후의 입력을 버린다. 널 포인터를 리턴한다. 구현에 의존하는 "handler"함수를 호출하는데 이것이 프로그램의 종료나 중단을 야기할 수 있다.

728x90

'Programming > C' 카테고리의 다른 글

C언어 공부 19  (0) 2019.05.29
C언어 공부 18  (0) 2019.05.29
프로그래밍 연습 7  (0) 2019.05.12
프로그래밍 연습 6  (0) 2019.05.12
C언어 공부 16  (0) 2019.05.11

+ Recent posts