본문 바로가기
TIL/따배씨

문자열 함수들 (2021-01-19~2021-01-21)

by Dev_Dank 2021. 1. 19.

11.1 문자열을 정의하는 방법들

지난강의에서 문자열의 경우 컴파일러가 자동으로 마지막에 널캐릭터를 추가된다는 내용이 나왔었음. 

puts() 함수는 문자열을 출력을 해준다. 그리고 자동으로 \n을 붙여준다. 

문자열의 포인터를 하나 받아들이고 있는것을 볼수 있다.

문자열도 배열처럼 메모리에 저장이 되어있어서 함수에게 전달할때는 문자열의 첫번째 글자 주소를 포인터로 넘겨줌. 

puts 함수를 사용하여 문자열을 출력하는 과정은 다음과 같다. 

문자열의 포인터는 배열처럼 첫번째 글자의 주소만 전달 해줌. 

위의 예시에서 포인터로 선언한 문자열을 20번째줄에서 배열에서 하듯이 원소를 바꾸려하면 에러가 발생한다. 
예시사진에는 ptr이 const char*로 선언 됬으니까 비주얼 스튜디오가 바로 잡아주지만 const가 없이 선언될경우 컴파일이 되고 런타임에러 발생한다. 

이유는 배열은 읽기/쓰기 둘다 가능한 메모리를 사용하지만 문자열리터럴은 프로그램의 일부라서 읽기 전용 메모리에만 저장되어있기 때문에 수정이 안된다. 

문자열 배열을 아래와 같이 따옴표로 여러개 분리 해서 초기화하는 것도 가능하다. 

문자열도  배열처럼 맨첫번째 글자(배열에서는 첫번째 원소)의 주소가 활용된다. 이하의 예시 참조. 

이하의 3가지 방식으로 문자열 배열을 초기화 할 수 있다. m1과 m3의 경우 총 15칸중 문자열을 초기화하고 남는 공간은 컴파일러가 알아서 널캐릭터로 초기화 하여 0이 출력되는 모습이다.. (m2 에서도 마지막에 '\0' 안붙여도 컴파일러가 붙여줌)

문자열 배열의 크기는 지난 강의내용처럼 지정 가능 (실수가 들어가면 안됨)

VLA는 지원되는 컴파일러에서만 사용이 가능하다.

문자열의 배열도 배열이므로 subscripting(인덱싱)과 배열이름을 포인터처럼 활용하여 indirection도 가능하다. 

11.2 메모리 레이아웃과 문자열

레이아웃 = 설계도 구조도

즉 내가 작성한 프로그램이 실행될때 컴퓨터에서 메모리를 어떻게 용도별로 사용하는지에 대한 강의다. 

환경변수 =  프로그램이 실행되는 환경에 대한 설정이 담긴 변수 

컴파일러가 메모리크기가 얼마가 될지 알수 없을 경우  => 힙 사용

지역 변수가 담김, 컴파일러가 메모리크기가 얼마가 될지 알수 있을 경우  => 스택 사용

자유공간은 스택이나 힘이 늘어났다 줄어들었다. 

 

기본적인 메모리의 레이아웃. 운영체제가 프로그램을 실행 하는 부분이 마음대로 바뀌면 힘들것이다. 프로그램 코드는 그래서 읽기 전용이다.

 

포인터로 문자열 리터럴을 가리킬 경우 해당 문자열 리터럴은 읽기 전용 메모리에 있게되서 포인터로 접근하여 수정이 안됨.

컴파일러는 프로그램의 크기를 줄이는것도 임무라 문자열이 완전히 동일할 경우 한곳에 저장해놓고 여러번 사용함. 

배열은 배열자체가 각각 메모리를 차지하기 때문에 주소가 전부 다르게 나온다.(이하예시참조)

11.3 문자열의 배열

"Dancing in the rain"은 mythings, temp1 포인터로 가리키고 있기 때문에 text 세그먼트에 문자열을 저장해둬서 주소가 같게 나온다. 

"Studying the C++ language"는 yourthings 배열에서 저장되어있기 떄문에 같은 문자열이라도 이후 temp2 포인터로 가리킨것과 주소가 다르게 나온다.  

11.4 문자열을 입력받는 다양한 방법들

문자열 입력시 주의 할점은 입력받은걸 저장할 메모리 공간을 확보하고 받아야함.

입력을 받기위한 함수로 gets()가 있으며 scanf()와의 차이점은 이하와 같다. 

배열의 이름도 포인터라서 gets에 인자로 words가 들어간 모습이다.

www.tutorialspoint.com/c_standard_library/c_function_gets.htm

 

C library function - gets() - Tutorialspoint

C library function - gets() Description The C library function char *gets(char *str) reads a line from stdin and stores it into the string pointed to by str. It stops when either the newline character is read or when the end-of-file is reached, whichever c

www.tutorialspoint.com

fgets()를 쓸 수도 있다. 원래 파일 입력을 받는 함수(함수맨 첫글자 f가 file을 의미한다) 인데 stdin을 3번째 인사로 넣으면 콘솔창에서 입력을 받을 수 있음. 특히 지정한 배열의 크기가 작아도 런타임 에러가 발생하지 않음. 
fputs()도 stdout을 써서 파일 출력이 아니라 콘솔 화면에 출력 할 수 있음.

fgets는 리턴값으로 입력받은 포인터를 그대로 리턴해준다. (아래처럼 실제 출력해보면 알수있음)

fgets 함수는 파일 입력용이라서 콘솔창에서 ctrl + z (=EOF)입력시 널값을 반환한다. 

반복문으로 입력을 길게 받을수도 있다. 

scanf는 형식지정자로 입력받을 문자의 길이를 지정이 가능했다. 

만약 저장가능한 공간보다 더많은 것을 입력받으려 하면 런타임 에러가 발생한다. 

str1과 str2에는 글자 5개 + \0 으로 총 6개가 들어갈수 있는데 형식 지정자로 %6s를 해서 글자 6개를 입력받으려니 런타임 에러 발생.

11.5 문자열을 출력하는 다양한 방법들

puts는 뒤에 자동으로 줄바꿈(\n)을 붙여 준다. 

문자열에 널캐릭터(\0)가 없을 경우 이하와 같은 경우가 발생한다. 

fputs는 puts 처럼 사용가능하다. 

puts는 printf와 달리 자동으로 \n이 붙는다는 점에 주의 

Scanf는 빈칸을 만나면 입력을 그만 받아 들인다. 

이하와 같이 자기가 원하는 출력 함수를 만들어 사용할 수도 있다. 

11.6 다양한 문자열 함수들

strlen()은 문자열의 길이를 알려준다. 

strcat() 은 문자열 뒤에 무언가를 붙여주고 strncat()은 붙일 글자의 길이를 지정해서 붙일수 있다.

 strcmp()와 strncmp()로 문자열을 비교 할 수 있다. 

strcpy() 와 strncpy() 로 문자열을 복사할수 있다. 
주의 할점은 둘다 끝네 \0(널캐릭터를 추가해주지는 않는다는 것이다.

sprintf()와 같은 함수도 존재 한다. 

www.tutorialspoint.com/c_standard_library/c_function_sprintf.htm

 

C library function - sprintf() - Tutorialspoint

C library function - sprintf() Description The C library function int sprintf(char *str, const char *format, ...) sends formatted output to a string pointed to, by str. Declaration Following is the declaration for sprintf() function. int sprintf(char *str,

www.tutorialspoint.com

11.9 문자 함수를 문자열에 사용하기

<ctype.h>에는 문자함수 toupper(), ispunct()같은 것이 존재하며 이하와 같이 함수를 만들어 문자열에도 대응시킬 수 있다. 

11.10 명령줄 인수

지금까지는 main함수의 인수가 없는 형태로 사용해왔다 그런데 인수를 넣어서 사용 할 수도  있다. 이경우에는 기존에 하던것처럼 비주얼 스튜디오에서 바로 실행(Ctrl + F5)시키면 안되고 CMD에서 실행이 필요하다. 

커맨드라인에서 exe 파일을 실행할때 옆에 뭔가를 같이 입력해주면 사용자의 입력을 인수로 받는다. 
첫번째 인수는 자동적으로 해당 파일의 경로로 설정되있어서 경로가 나온다. 

이게 귀찮다면 이하의 사진처럼 할수도 있다. 

열려는 프로그램의 솔루션에 우클릭을 하고 Properties로 들어간다. 
Debug 섹션 에서 Command Arguments를 바꾼다. 

 

Ctrl+F5로 실행시켜서 비주얼 스튜디오 콘솔에서 실행이 되는 모습을 볼 수 있다. 

11.10 문자열을 숫자로 바꾸는 방법들

atoi()등의 함수를 이용해서 문자열을 숫자로 바꿀수 있다. 

전반적인 내용은 강의를 따라하는 편이 정리가 더 잘되기 떄문에 정리를 줄이겠다. 

댓글