다시 오신 걸 환영해요 이번 강의에서는 문자열 함수에 관해 얘기할 거예요
문자열, 문자
배열은 c의 변수 데이터
타입이 아니죠
어떤 연산자라도 사용할 수 있지만 여전히
문자열과 관련해 많은 작업을 할 수 있어야 하죠
조종할 수 있을 거예요
길이를 재야 해요 비교하고 싶다면
아마 온갖 것들이 변환할 거예요
다행히 표준 라이브러리에는 이런 유형의 작업을 수행하는
데 사용할 수 있는 기능이 많아요
먼저 가장 일반적인 내용부터 살펴보고 다른
강의에서 더 구체적인 내용으로 넘어가죠
문자열은 null 문자로 종료된
char 배열이란 걸 이미 알고 있죠
문자열은 C 프로그램에서 주로 사용되죠
C는 운 좋게도 여러 기능을 제공합니다 특히 현악기에 맞게 설계됐죠
우리가 논의할 것은 여러분이 사용하게 될 가장 일반적인 거죠
우선 str 길이 함수를 이용해서 문자열의 길이를 알아볼게요.
문자열을 복사하는 거죠
아까 말씀드렸죠? 배정 연산자를 이용해 문자열을 할당하면 안 된다고요
그래서 str 카피나 strn 카피를 사용하죠
두 개의 문자열을 결합할 수도 있고요
ST 고양이와 STN 고양이가 있어요
2개의 문자열이 같은지 결정하는 것도요
등호 연산자는 문자열을 비교할 수 없습니다 배열이기
때문이죠
문자열을 비교하고 싶다면 c 라이브러리가 제공하는
특별 기능을 사용해야 해요 스트 비교와 strn 비교요
우선 길이에 대해 이야기해 보죠
이 모든 함수는 문자열로 정의돼요 이 함수 중 하나를 호출하거나
호출할 때 그걸 포함해야 해요
활시위 길이예요
스트링 길이는 스트링의 길이를 찾는 함수입니다 아주 간단하죠
사이즈 t 변수로 반환되죠
사이즈 t를 int로 변수할 수 있어요
하지만 먼저 str의 길이를 사용하고 싶다면 문자열 헤더 파일을 포함해야 합니다
이렇게 사용하면 돼요
큰 따옴표 안에 문자열 리터럴을 만들어 문자 배열을 할당하는 거죠
캐릭터 배열의 크기는 지정하지 않아요
컴파일러가 그 작업을 하고 null 터미네이터를 추가할 거예요
일단 문자열을 문자열 상수로 정의하고 나면
str의 길이를 호출할 수 있어요 그리고 그 캐릭터를 전달하죠
아주 멋져요
가장 많이 사용되는 것 중 하나입니다 문자열의 길이가 일정해야 하기
때문입니다 유효성 검사 같은 것을 할 때 버퍼 오버플로가
없다는 것을 확인하고 싶다면 그렇게 하셔도 되고요
이 함수가 문자열을 바꾸죠
함수 헤더는 형식적인 매개 변수 문자열을
선언할 때 상수를 사용하지 않아요
가서 줄을 보세요 사용자 내부
h를 디렉터리에 포함하면 상수로 정의되지
않은 걸 보실 수 있어요
스트링 복사요 문자열 복사란 기존 문자열을
수정하거나 내부에 데이터가 있는
기존 문자열을 수정하는 거죠
안에 아무것도 없으면 뭔가를 넣고 싶을 수도 있고요
C에 임금 인상을 못 하면 조건도 못 붙여요 앞서 언급했듯이 문자를 선언하고
= 할당 연산자를 사용하는 건 작동하지 않죠
그래서 str 복사 기능을 이용해서 문자열을
기존 문자열에 복사해야 해요
문자열 연산자와 같은 거죠 배정 연산자요
2개의 문자 배열 소스와 대상을 선언할
경우 str 복사 소스라고만 하면 돼요 그 소스가
뭐든 문자열에 넣으면 되죠 대상도 마찬가지고요
복사를 하고 싶다면 변수도 넣을 수 있어요
여기서 하려는 건 첫 번째 매개 변수는 어디에 복사를 하느냐는 거죠
두 번째 매개 변수는 여러분이 복사하는 문자열이에요
소스는 str copy 후에 그 안에 소스가 있을 거예요
Destination 또는 Destation이 내부에
있을 거예요 str 카피 호출 후에요
str 복사 기능은 소스 문자열이 대상 문자열에 맞는지 확인하지 않아요
줄이 크면 어떻게 될까요?
아까 예제에서 목적지에 글자가 100개면 어떻게 될까요?
이걸 종착역으로 하는 대신 100개의 캐릭터로 했죠
글자가 50개뿐인 원본으로
복사를 시도했죠 문제가 생기겠죠
목적 문자열은 원본 문자열보다 클 거예요
str 복사본을 소스로 복사하려고 하면 우리가 여기에 두었던 것을 소스로 복사하는
대신에 5번 혹은 10번 소싱을 하고 50분의 1을 하면 오류가 발생할
거예요.
제가 보여드리죠
문자열을 복사하는 더 안전한 방법은 strn 복사기를 이용하는 거죠 n을 strn 카피로 바꿀
수 있어요
세 번째 논거예요
카피할 수 있는 글자 수요
여기서 얼마만큼 복사하고 싶은지 지정할 수 있어요
따라서 소스는 40 사이즈 대상은 12 사이즈일 경우 m 집합을 먼저
하면 돼요 null 터미네이터 안에 있는 데이터의 크기를 설정하는 거죠
뭔가를 추가하면 자동으로 거기 있을 테니까요 걱정하지 마세요
str 복사본은 hello를 복사해서 소스로 보내는 방법을 보여주고
어떻게 전송하는지가 소스보다 더 큰지는 확인하지 않아요
strn 복사를 하고 목적지에서 복사를 하면 소스를
복사하고 처음 10개 글자만 복사할 거예요
세 번째 인수는 목적지의 크기와 일치해야 해요
그럼 코드 블록으로 가서 str의 길이를 살펴보고 문자열 복사하기를 보면서
어떻게 작동하는지 알아보죠
이게 메인 요리예요
스트링 길이를 맞추는 건 정말 쉬워요
캐릭터 배열을 만들 거예요 캐릭터 영역을 만들 줄 알죠 크기를 지정할 필요는 없지만
이름을 먼저 넣은 다음 괄호를 넣어야 해요
그런 다음 뭐든 원하는 걸로 초기화할
수 있어요 큰 따옴표 안이요 큰따옴표는 문자열 리터럴이죠
제 이름은 Jason이에요.
그 결과 S는 사이즈
17 글자의 배열이
되죠
이 모든 글자와 Null 터미네이터요
Null 터미네이터는 백슬래시 0이죠
컴파일러에 의해 자동으로 추가되기 때문에 굳이 넣을 필요가 없어요
그렇게 문자 배열의 문자열을 초기화하고 생성할 수 있어요
그런 다음 프린트하려면 printf하고 길이만 정하면 돼요
그런 다음 %s를 문자열을 디스플레이하기
위한 형식 지정자로 넣었어요
그런 다음 문자열 이름만 말하면 돼요
헷갈리지 않도록 문자열이라고 하죠
이전에 했던 것처럼 ampersand를 사용하지 않아도 됩니다 이전 예제에서
했던 것처럼 문자열이라고 하면 되죠 이걸 컴파일하고 실행하려면
문자열 헤더를 포함해야 할지도 몰라요
이걸 컴파일하고 실행하면 문자열의 길이를 알 수 있어요
길이는 문자열 길이 함수를 호출하지 않았는데요
길이를 표시하고 싶으면 함수를 호출해야 해요 그런
식으로 하는 거죠 줄은 str 길이 안에 넣어요
실행하면 문자열의 길이를 볼 수 있어요
이건 줄이 아니라 실이어야 해요
문자열을 표시하는 방법이죠 문자열의 길이를 표시하고
싶으면 함수에서 %d를 해요
이제 실행하면 길이가
16인 16을 프린트하는 게 보이시죠
str 길이를 이용하는 건 아주 쉬운 기능이에요 문자열을 복사하려면
str 비교를 사용하세요
strn을 사용해 바이트를 명시하는 거죠
여기 제 이름이 Jason이라고
하면 다른 문자열을 생성합니다
이건 그냥 둘게요 구체적으로 명시할
필요도 없고 temp라는 문자열을
하나 더 생성해서 str과 동일하게
만들고 비교할 거예요 복사하고
싶은 것을 전달하는 거죠
빈 문자 배열을 만들어 사이즈 50으로
만들게요
이제 strn copy라고 해 볼게요.
첫 번째 매개 변수는 복사를 하려는 곳입니다 temp라고 하죠
두 번째 매개 변수는 복사를 하려는 건데 문자열이죠
50바이트 이상은 입력하지 않고요
temp 크기도 지정할 수 있습니다 50바이트
이상은 입력하지 않게요 null 터미네이터를 위해 do-1을
해야 할 거예요
이 경우 세 번째 매개 변수는 아주 중요해요 버퍼 오버플로는 절대 없을 테니까요
항상 strn 카피를 쓰세요 strn 카피 말고요
여기서 문자열을 표시해 복사됐는지 볼 수 있어요
임시직은 a% s로 바꾸고요
이걸 빌드할 때 길이가
아니라 스트링이 이렇게 되는 걸 보고 세미콜론으로
끝내야 해요
이제 컴파일해야죠
이제 실행하죠 복사된 문자열을 볼 수 있어요
제 이름은 Jason이고 temp에 저장되어
있습니다 temp를 출력했기 때문이죠
항상 사본을 사용하세요 str 카피는 쓰지 마세요
버퍼 오버플로가 없도록 할 테니까요
그리고 세 번째 매개 변수는 항상
목적지여야 해요 근원이 아니라
목적지죠 이 문자열 전체를 복사하라고 하는 건 무의미하죠
이게 작으면 문제가 생기거든요 항상 크기를 알려주세요
여기서 사이즈오프 연산자를 이용해
문자 안에 몇 바이트가 있는지 알 수 있죠
몇 가지 함수에 대해 더 얘기해보죠
길이를 정하는 법과 문자열을 복사하는 법을 알았죠 문자열을 연결하는 건 어때요?
str cap 함수는 두 개의 인수를, 두 개의 문자열을 인수로
취하고 첫 번째 문자열의 끝에 두 번째 문자열을 복사해요.
두 번째 줄은 그대로고 첫
번째 줄만 바뀌었죠 첫 번째 인수의 값을 반환할 거예요
첫 번째 문자열의 주소 두 번째 문자열이 추가되는 곳이죠
그러니까 뭔가를 반환하고 어디에 추가했는지 알려주는 거죠 그걸 사용해야 할 경우에요
여기 예제가 있어요 문자열 문자열을 생성했는데 Null
터미네이터와 함께 문자열을 포함하고 있죠
문자열 input을 만드는데 80이에요, 비었죠
문자열을 입력해 연결되도록 하는 거죠 인용해서 읽었죠
그런 다음 연결하죠
원래 문자열을 프린트하고 연결된 문자열 다음에 input을 하죠
이것 다음에 입력한 게 뭐든 문자열
끝에 놓이게 되죠 Jason을 입력하면 스페이스 스트링 Jason이 되겠죠.
문자열은 그것과 같겠죠
고양이 모양으로 그렸잖아요
먼저 활시위를 출력하고 str cat을 불러요
input은 사실 input과 동일합니다 input
뒤에 문자열이 따라오는 거죠
잠시 후 이 예제를 살펴보도록 하죠 str 카피처럼 strn-end
캣도 있어요
그래서 합친 버전이 새로운 1열이 되는 거죠
스트링과 strn 캣을 연결하는 것처럼 strn
캣도 있어요
스트, 캣도 스트, 카피에 같은 문제가 있어요 버퍼 오버플로우가 있을 수 있어요 두 번째 줄이 첫 번째
배열에 맞는지 확인하는 게 아니에요
첫 번째 배열에 공간이 충분하지 않으면 버퍼 오버플로 문제가 발생할 수 있어요
strn 고양이를 사용하세요
두 번째 인수는 추가할 수 있는 최대 문자의 수를 나타내죠
예를 들어 strn cat와 2개의
문자열 버그가 추가된다면, 어떤 버그가 먼저냐에 따라 13개의 문자열만 추가될
거에요. addon이 13보다 작으면
null 터미네이터가 보일 때까지 추가돼요
이 예제에서는 두 개의 문자열을 생성하고 있어요
여기가 원천이고 목적지예요 STN 고양이를 새길 거예요
마지막에 데스티네이션에 15자만
복사할 거예요 대상의 크기가 어떻든 대상의 +15가
되겠죠 그런 다음 프린트해요
코드블록에서 다시 살펴보죠
여기 예제가 있어요 두 개의 문자열 배열을 생성하겠습니다
하나는 사이즈 50 다른 하나는 사이즈 50이죠
2개의 str 복사를 해서 데이터로 설정할게요.
여기가 원천의 목적지예요 12번 라인에서는 strn 고양이 소리를 내요
목적지는 우리가 연결하는 게 되겠죠
그래서 소스는 연결할 거예요
캐릭터 15개만 할당할 거예요
소스가 15개 이상이면 다 복사하진
않겠죠
이걸 빌드해 실행하면 이제
여러분이 보시게 되는 건 이건 소스
파일이라고 하거나 이건 대상으로 하고 다음은
이건 소스라고 하는 거죠
이건 목적지, 이건 소스죠
그걸 대상의 끝에 연결시켰죠
항상 strn cat을 연결하는 데 사용해야 해요 그래야 버퍼 오버플로가 안 생기죠
str 비교에 대해 이야기해 봅시다. 제가 계속 실수로 str
카피, str 비교라고 말했네요.
문자열을 비교할 때도 함수를 사용해야 해요
문자열을 다른 문자열과 비교하고
싶다면 같은 주소인지 아닌지만 확인하는 등호를
두 개 쓸 순 없어요 그래서 str 비교를 사용해야 해요
문자열의 내용물을 비교할 거예요
배열과 비교하지 않아요 그래서 다양한 크기의 배열에
저장된 스트링을 비교하는 데 사용되죠
캐릭터와 비교하지 않아요
사과 같은 인수나 큰따옴표로 된 a를 써도 되지만
한 글자 A 같은 문자 인수는 안 돼요
이 함수는 문자열에 대해 관계형 연산자와 같은 역할을 하죠
비교 함수는 문자열이 같은지
아닌지를 알려주는 값을 반환합니다 문자열이
더 큰지 적은지를요
등호라면 0을 반환하겠죠
더 작으면 0보다 작은 반환이 나오죠 str 1이 str
2보다 작으면요
str 2가 str 1보다 작으면 0보다 크게 반환되죠
그게 정확히 무슨 뜻이죠? 어떻게 진행되는지
예를 보여드리죠
이걸 코드 블록에 넣고 실행하죠
하지만 여기에선 str compare를 하고 있어요 값이 무엇인지 알려드리죠 더 작든
크든요 왜냐하면 명확하지 않으니까요
이걸 코드 블록에서 살펴보죠
여기 예제가 있어요 여러 개의 문자열을 비교하고 str
비교 결과를 보여줍니다
01이든 뭐든 간에요
문자열 a와 a를 비교하면 큰따옴표가 있어야 해요
여기서 보시는 건 우리가 부르는 걸 프린트하는 거예요
따옴표를
줄일게요 백슬래시를 넣어서 따옴표 문자를 출력합니다
문자열을 끝내지 않네요 하지만 A와 A를 비교하면
0을 반환해야 해요 0은 문자열이 같다는 뜻이니까요
a와 b를 비교하면 str 비교는 더 적게 반환돼요
A가 B보다 작으니까요
Ba는 0보다 커야 해요
이걸 살펴보면서 실수가 없는지 확인하죠
실제로 출력에서 보게 될 거예요
이걸 실행하면 어떤
숫자가 반환될지 기억하는 데 도움이 되죠
A와 A를 비교하면 0이 나오죠
a와 b를 비교하면 b는 a보다 작으니
마이너스 1이죠 0보다 작은 거요 전
반대로 말했을지도 몰라요 저조차도
헷갈리네요 a는 b보다 크니까 a는 b보다 크니까
a는 b보다 크니까 마이너스 1이죠
B는 a보다 작으니 0보다 큰 건 1이죠
C가 a보다 크니까 b가 a보다 크면
1이 나오죠
대문자와 소문자를 비교해야 하죠
대문자와 소문자를 비교하면 반대예요 Z는 소문자 a보다
작아요
대문자는 언제나 소문자보다 작아요
사과와 사과를 비교하려고 하면 1이 될 거예요 사과가 사과보다
작으니까요
그런 식으로 비교해요 0이 1보다 크거나 1보다 작다는 걸
이해하는 게 중요해요 다시 0보다 작은
것은 첫 번째 문자열이 두 번째 문자열보다 작다는
걸 말해주죠
0보다 크면 첫 번째 줄이 두 번째 줄보다 크다는 거죠
이 기능은 사용하기 쉬워요 strn 비교는 걱정할
필요가 없어요 비교하는 배열의 크기는 중요하지
않으니까요
str 비교 함수는 일치하는 문자열이 다를 때까지 문자열을 비교하죠
현 하나 끝까지 연결할 수 있어요
스트론 비교 함수는 문자열이 다를 때까지 비교합니다 혹은 세 번째
인수에 의해 지정된 문자 수의 수를 비교할 때까지는요
이 경우에는 버퍼 오버플로를 위해 strn 비교를
할 필요가 없어요. 존재하긴 하지만 일정한 수의
글자를 비교하고 싶을 때만 사용하죠
str 카피나 strn
카피, strn 카피와는 좀 다르게 사용되죠
strn 비교는 많은 글자만 디스플레이하고 싶다고 하죠
접두사만 찾는다면 유용할 거예요
stro로 시작하는 문자열을 검색하고 싶다면
검색을 처음 다섯 글자로 제한할 수 있어요 그리고
strn을 사용해 비교할 수 있죠
이 예제에선 = 0이라고 했죠
str 비교를 쓸 때 이런 if문을 자주 보죠
이 문 안에서 str 비교를 하는 게 보이실 거예요 = 0으로 등호 여부를 결정하는 거죠
strn은 첫 다섯 글자를 사용해 천문학의
첫 다섯 글자와 천문학을 비교해요
찾았다고 나올 거예요 0과 같을 거예요 천문학을 찾았다고 나오겠죠
같은 걸 하지만 감탄이라 불리는 다른 문자열과 비교하면
찾지 않을 거예요 실제로 디스플레이를∙∙∙ 감탄이샛별보다
크다고 할 거예요 0보다 큰 걸 표시할 거예요
즉, 1이죠 데이터는 표시하지
않을 거예요
모든 내용물을 문자열과 비교할 때는 str을 사용하세요
문자열에 접두사만 비교하고 싶을 땐 strn 비교를 사용하세요
같은 유형의 구문이나 strn이 세 번째 인수를 비교하죠
우리가 사용할 아주 중요한 함수들에 대해
많이 이야기 했었는데요 주로 strn 길이,
strn 복사본 strn cat, strn 비교
여러분이 익숙해질 수 있도록 이런 기능을 활용하는 도전이
있을 거예요
하지만 정말 익숙해질 거예요 결국 계속 반복해서
사용하게 될 테니까요 고마워요