다시 오신 걸 환영해요 또 신나는 강의네요 이 강의에서는 문자열과
문자열 함수에 대해 더 알아보겠습니다
주로 문자열을 검색하고 분석하는 기능이죠
좀 더 문자열 함수에 대해 얘기해보죠 문자열을 찾고 있어요
문자열을 찾고 있어요
이 모든 함수가 문자열 헤더에 있을 거예요
특정 문자열 검색 함수가 있는데 특정 문자나
하위 문자열을 찾을 수 있어요
그 기능의 이름은 strchr와 strstrstr예요
문자열 안에서 하나의 문자열을 찾거나 하부 구조를 찾는 거죠
몇 가지 예제를 보여드리죠
문자열 토큰화 기능도 있어요
문자열 토큰화에 대해 물을 수도 있어요 먼저 토큰이 뭔지 정의해야 해요
토큰은 미묘자에 의해 한정된 실 안에서 캐릭터들의 연속성을 말해요
딜리미터는 문자열에 있는 것으로 특별한
의미가 있어요
토큰은 완전한 문자열이 있다면 이건 Jason이고
띄어쓰기로 분리되어 있어요
토큰은 이거일 수도 있고 이거일 수도 있고 제이슨일 수도 있죠
전체 실을 가져다가 분리하는 방법이죠 성범죄자에
따라 경계를 나누는 거예요
여러분의 delimter가 실제 문자열에서
유효하지 않은 걸 확인하세요 파일에서 읽을 때도 delimiters를
쓰죠 같은 형식이에요
문장을 단어로 나누는 걸 형식화라고 하죠 strtok라는 함수를
사용할 거예요
문자열 분석도 얘기하고 싶어요 이런 게 아주 많아요
글자가 소문자인지 대문자인지 문자와
숫자인지 확인하기 위한 것들이죠
주로 문자열에 작업되지만 사이드 문자열의 문자열이죠
전체 문자열에도 적용할 수 있어요
이제 문자열에 대해 좀 더 상세히 알아보죠
이런 함수를 이해하려면 포인터에 관해 얘길 좀 해야 해요
C에서 포인터는 중요한 개념이에요
전체 섹션이 포인터에 할애될 거예요
아마 다음이나 다음에요
의논할 게 많아요 가장 혼란스러운 주제일 거예요
지금 상세히 다루진 않을게요 관련이 없으니까요
살짝만 다룰게요 포인터가 뭔지 살짝만 알려드리려고요 그래야 저희가
사용할 이 함수들을 이해하실 수 있으니까요
그게 유일한 목적이에요 지금 이 시점에서 포인터를 완전히 이해
못 하신다면 이 슬라이드들 이후에요 걱정 마세요
포인터라는 개념은 나중에 자세히 논의할게요
하지만 문자열 함수를 이해하기 위해서 잠깐 보여드릴게요
C는 놀랍도록 유용한 유형의 변수를 제공합니다 포인터라고 하죠
저도 그 얘기 했어요 메모리나 메모리 할당과 관련이 있어요
어떤 언어는 프로그래밍해본 적이 있는데 프로그래밍이
완전히 처음이 아니라면 어떤 언어는 자동으로 메모리를 관리해요
메모리를 할당했다가 삭제하죠 자바 같은 언어는 그래요
쓰레기 수거 장치죠 c 같은 언어는 이러지 않아요
포인터를 사용하기 위해 메모리를 생성할 때마다
그 메모리를 삭제해야 해요
하지만 포인터는 아주 유용하고
주소를 저장하는 변수예요
주소는 기억에 남아요
보통은 헥사데시멀이죠
주소의 값은 메모리의 다른 장소에 있어요
포인터는 주소를 가리키는데 그 주소엔 값이 있어요
과거에 scanf 함수와 함께 주소를 사용했었죠.
우리가 사용한 ampersand 기호는 연산자 주소예요
Scanf 함수는 두 번째 매개 변수로
데이터 저장을 원하는 변수를 받아들여야
해요 그 변수는 포인터가 돼야 하죠
scanf 함수는 포인터를 기대해요.
그 자체로 정수를 만들려면 이건 포인터가 아니에요
하지만 주소를 알면 이제 포인터가 되죠
ampersand를 이용해 원시 데이터 타입의 주소를 찾고 있어요
주소 개념은 좀 익숙할 거예요
기억하세요, 이제부턴 포인터와
함께 int 번호를 생성하면 그건
포인터가 아니고 25죠
하지만 ampers와 주소를 알면 포인터에 할당할 수 있어요
포인터는 C의 특별한 구문을 갖고 있죠 별표는 포인터를 나타내요
그래서 25라는 값의 변수 번호를 선언했고 숫자 주소를
포함하는 pNumber라는 별표를 이용해
포인터를 선언했어요
그리고 별표는 포인터를 선언하기 위해 사용됩니다 이게 포인터
데이터 타입이란 걸 알려주는 거죠
변수 p 넘버의 값을 얻기 위해서요 왜냐하면
p 넘버는 무엇일까요? 메모리의 주소를 가리키는 포인터죠
p 번호의 값을 보려고 하면 주소를 알려주죠
주소가 가리키는 것의 값을 얻고 싶다면 참조를 해제해야 해요
c가 사용하는 특별한
구문이 있어요 별표와 변수 이름이라고 하는데 값을 갖고
있는 메모리 위치에 액세스하는 방법이죠
따라서 메모리 위치로 데이터를 할당하려면 *p number라고 해야 하죠
그 효과는 포인터에 의해 지정된 주소에 저장된 데이터에 액세스하죠
그래서 포인터에 관해 얘기할 때 정말 헷갈려요 이런 개념에 익숙하지 않으니까요
변수에 값이 있다고 생각하시면 그게 다예요 하지만 변수는 주소를 가질 수 있고
주소는 값을 가질 수 있죠
이 슬라이드는 제가 방금 말한 걸 설명하려는 거예요
내가 읽은 책에서 찾았어요
메모리의 포인터의 개념을 보여주는 슬라이드입니다 주소와
어떻게 작동하는지도요
제가 방금 말한 걸 반복하는 거예요
하지만 & 숫자의 값은 숫자가 위치한 주소죠
그래서 변수 2개가 있는데 숫자와 P 숫자요
P 숫자는 포인터고 숫자는 int죠 그런데
포인터의 형식도 명시해야 해요
포인터는 주소지만 여전히
형식이나 주소가 가리키는 곳을 지정하죠
int *p 숫자는 숫자의 주소와 같고요
메모리에 있는 숫자는 예를 들어 1,000의
주소를 가리키고 그 값은 25죠
P 번호는 실제 P 번호에 105
주소지만 그 주소의 값은 1000
주소예요
p 번호의 값을 알려면 1000을 규제해야 해요 그럼 25가
나오죠
제가 포인터를 언급한 이유는 많은 문자열
함수가 포인터를 반환하기 때문이에요
별로 중요하지 않을 거예요
배열 안에서 특정 캐릭터를 어떻게 넣을지 알고 싶을 때만 중요하죠
하지만 짧게 언급하고 싶었어요
지금 당장은 이해가 안 돼도 괜찮아요 나중에 자세히
설명할 거니까요
하지만 우리가 사용할 문자열 함수는 포인터를 리턴하고 그 리턴을
이용해 뭔가 유용한 걸 할 거라는 걸 알아두세요
과거에는 str 복사본과 str 비교를 사용할 때 포인터를 전달했지만
포인터를 반환하진 않았어요 그 포인터를 사용할 필요가 없었죠
이제 포인터를 사용해야 하는데 그게 무슨 뜻인지 간단히 설명할게요
포인터는 주소를 가리키죠
그런 다음 그 주소를 이용해 구문 분석이나 필요한 걸 할 수 있어요
부담 안 느끼셨으면 좋겠네요 이해 못 하셔도 걱정하지 마세요
문자열 분석, 토큰화
검색 예제를 살펴보도록 하죠
문자열을 검색하기 위해서는 strchr 혹은 strstrstr을 사용하게 될 거예요.
strchr는 한 문자로 주어진 문자열을 검색하죠
함수에 대한 첫 번째 인수는 검색되어야 할 문자열입니다
문자 배열의 주소가 되겠죠
두 번째 논쟁은 여러분이 찾는 캐릭터예요
잠시 후 예를 들어보죠 그래서 이 함수는 시작에서 시작하는
문자열을 검색하고 문자가 발견되는
문자열의 첫 번째 위치에 포인터를 반환하죠
그래서 포인터가 중요한 겁니다 전체 값을
리턴하는 게 아니니까요 문자열 안의 문자에 포인터를
리턴하는 거죠 주소가
본질적으로 배열의 인덱스를 나타내요
메모리의 이 위치의 주소는 타입 캐릭터 별이고 char의
포인터로 설명됩니다. char는
메모리에 있는 하나의 캐릭터에요.
반환된 값을 저장하려면 캐릭터 주소를 저장할 수 있는 변수를 생성해야 합니다 그래서
포인터를 만들어야 하죠
글자가 발견되면 함수는 특별한 값을 반환합니다 null이죠
Null은 포인터가 아무것도 가리키지 않는다는 뜻이에요
포인터에 관해 얘기할 때 Null을 사용하죠
아무것도 찾지 못했다는 뜻이에요 아무것도 가리키지 않죠
뭔가를 가리키면 그 캐릭터를 찾은 주소지를 가리키죠 거기서부터
구문 분석을 시작할 수 있어요
이전 강의에서 이야기했듯이 메모리에서
캐릭터 배열을 만들 때는 각각의 캐릭터가
바이트로 표시되어야 하니까요
문자열을 구문 분석할 때 문자열에서
어떤 문자가 시작하는지 알고 싶다면 바이트 값을 반환하면
됩니다 그러면 거기서부터 볼 수 있죠
스트차르는 이렇게 사용해요
문자열을 생성하면 갈색 여우를
이용해 초기화하죠
그런 다음 문자 하나를 만들어 q로 초기화하죠
그런 다음 포인터를 만들죠 포인터를 만들어야 하니까요 str char에서 반환되는 것이거든요
문자열에서 어디서 문자를 찾았는지 알 수 있게 해주는 거죠
포인터를 null로 초기화할 거예요 지금은 아무 단서도 안 나오니까요
그리고 str char를 호출해서 문자열을 전달할 거예요 빠른 갈색 여우 문자열이죠
그리고 q라는 단일 문자를 전달할 거예요
여우가 갈색 여우의 몸속을 들여다볼 거예요
먼저 q를 찾으면 그 q의 주소를 반환할 거예요
p는 char가 str의
네 번째 인덱스를 가리키고 있어요.
t는 서브제로 h는 서브1이고 e는 서브2 스페이스는
서브3 q는 서브4니까요
숯이 갈색 여우에서 q를 가리킬 거예요
문자열에서 캐릭터가 정확히 어디서 시작하는지 알 수 있죠
str char에 대한 첫 번째 논쟁은 검색해야 하는 첫 번째 장소의 주소입니다. 이건
검색 스트링이고요.
두 번째는 추구하는 캐릭터예요 여러분이 찾는 단일
캐릭터요
두 번째 인수가 int 형식이길 기대하죠
엄밀히 따지면 str char, 두 번째 argument가 들어가죠.
C 컴파일러는 자동으로 차트를 int로 변환하죠
본질적으로 ASCII 값을 얻을 거예요
단일 char 대신에 q 단일 문자를
정의할 수 있어요 int로 정의할 수 있죠
그런 세부 사항을 아셔야 할 것 같아서요
하지만 p get char는 퀵 브라운 여우를 가리킬 거예요 q로
시작하니까요 그리고 나서 null 터미네이터로 갈 거예요 여러분이 프린트하려고 하면요
이 예제를 실행하면 빠른 갈색 여우가 되겠죠
전체 문자열에서 하나의 문자를 검색하는 방법이죠
str char를 쓰고, 포인터를 쓰고, 포인터를 표시하세요.
그 포인터를 어떻게 표시할까요? 다른 글자를 디스플레이하는 것처럼 printf를 사용하세요, %s를요
전체 문자열에서 글자를 찾기 위한 멋진 메커니즘이죠
문자열 안의 문자열을 찾고 싶다면, 즉 서브스트링인 strstrstr을
이용하면 돼요.
모든 검색 함수 중 가장 유용할 거예요
스트링 하나로 하부 스트링 발생을 검색하죠
그리고 하위 스트링이 발견되는 첫 번째 문자열의 위치를 포인터로 반환합니다 str
char와 아주 유사하지만 전체 문자열을 검색하죠 일치하는 게 없으면 null을 반환하죠
첫 번째 인수는 스트 차르처럼 검색해야 하는 스트링이에요
두 번째는 여러분이 찾는 다른 스트링이에요 여기 예제가 있어요
다른 것과 아주 비슷하죠 단 하나의 문자가 아니라
하나의 문자열을 찾는다는 것만 빼고요
단어죠, dog와 같아요
그리고 문자도 있어요 모든 개는 자기만의 날이 있다는 거죠
다시 포인터를 생성합니다 왜냐하면 함수가 반환하는 게 이거니까요
strstrstr를 호출할 때 보고 싶은 문자열을 텍스트에 전달해요
두 번째 인수는 단어로 해당 문자열 내부를 살펴봐야 하죠
문자열이 워드에 저장된 첫 발생을 기록한 텍스트를 찾을 거예요
스트링 도그는 텍스트에서 7번째 문자로 나타나요
문자를 보면요
텍스트 하위 6은 dog와 같아요 거기서 시작하죠
그래서 포인터는 텍스트 + 6 dog 주소를 가리키죠
거기서 시작해서 null 터미네이터로 가요
오늘 운수 대통할 거예요
대소문자 구별이 되니까 조심하시고요
대문자 D-O-G를 제공하면 아무것도 찾을 수 없어요
올바른 케이스만 찾을 뿐이죠
서브스트링과 문자열을 찾는 데 사용됩니다 아주 유용합니다 왜냐하면
많은 경우에 프로그램에서 문자열 안에 있는 문자열을 찾습니다 왜냐하면 거의
GREP와 비슷하기 때문입니다 Linux에서 GREP를 사용한 적이 있다면요
이해가 되면 좋겠네요 문자열 토큰화요
토큰은 문자열의 연속을 의미합니다 문자열 중 하나는 모방자에 의해 묶여 있죠
딜리미터는 뭐든 될 수 있지만 문자열에 고유한 것이어야 하죠
"A"는 삭제하세요 이제 단어에서 유효한 문자열을
찾을 테니까요
스페이스나 쉼표처럼 독특한 걸로요 이건 보통 단일 문자열의 단어들을
위한 경계로 사용되죠
문장을 단어로 나누는 거예요 토큰라이징이라고 하죠
이 strtok 함수는 문자열 토큰화에 사용되죠
두 개의 인수가 필요해요
문자열은 토큰화됩니다 스페이스와 delimiters를 가진 전체 문자열이죠
그리고 제한된 양극 문자를 포함하고 있는 문자열이요
테두리로 무엇을 설정하고 싶은지 지정해 줄 수 있어요
여기 예제가 있어요
캐릭터 배열 80을 만들고 있어요
Hello, How are you are your name is 대시 Jason이에요
그런 다음 상수 문자열을 생성해 딜리미터를 나타냅니다
마이너스 대시요 조금 달라 보이지만 여전히 대시보드예요
둘 다 대시보드죠
그리고 토큰인 포인터를 생성하죠
스트톡이 우리 토큰을
반환할 테니까요
strtok를 호출하고 문자열을 전달하고
delimiterss를 전달하면
토큰은 그것이 찾는 첫 번째 것과 같아지죠
그래서 처음 strtok를 호출할 때 hello, How are you
space와 동일해야 해요 그러면 대시보드와 일치하는 것을 찾죠
두 번째로 호출하면
제 이름이 출력되죠
세 번째를 호출하면 Jason을 출력할
것입니다 왜냐하면 dash를 이용하기 때문이죠
그래서 while 루프가 있는 거죠 토큰이 null이 아닐 때 토큰을
출력하는 거죠
스트톡을 호출해서 다음 토큰을 얻어요
null은 첫 번째 매개 변수고 s는 두 번째
매개 변수예요 그런 다음 디스플레이하죠
코드블록에서
살펴보죠 그게 더 이해하기 쉬우니까요
이걸 만들어보죠 방금 이 예제를 봤었죠
출력이 뭔지 보여드릴게요 여기서 무슨 일이 벌어지는지 명확하게요
첫 번째 토큰을 출력한다고 나오네요 Hello,
How are you인가요?
첫 번째로 하는 일은 첫 번째 토큰을 찾아서 프린트하는
것입니다. Hello, How are you, my name is 그리고 Jason이죠.
자, Hello, How are you
첫 번째 대시보드를 찾아 프린트하세요 제 이름은 다음 토큰 찾기이고
세 번째는 제이슨이에요 세 번 호출해야
받을 수 있어요
첫 번째는 str에서 토큰화할 거예요.
다음 것은 null로 넘길 수 있어요. 다시 보고 싶지 않으니까요. 다음 토큰만 받으면 되니까요.
두 번째는 null을 넘기고 s를 넘기면 돼요
그럼 다음 토큰을 줄 거예요
스트톡을 이렇게 쓰는군요 구문 분석에 도움이 많이 돼요
뭔가를 구문 분석하면 경계가 생기죠
마지막으로 다룰 함수는 문자열 함수 분석인데요
손님이 너무 많아서 작은 테이블을 준비했죠
이건 아래고 이건 위예요 예상한 대로 작동해요
글자가 소문자인지 대문자인지 테스트하는 거예요
특정 글자를 테스트하고 있지만 문자열 안에서 사용되죠
각각의 함수에 대한 인수는 여러분이 찾고자 하는 문자열이죠
그럼 이 모든 함수는 type int의 비제로 값을 반환합니다
그 문자가 테스트되는 세트 안에 있다면요
단어들을 찾기 위해 int 문자를 전달할 거예요
단어 안에 대문자가 있다면 그걸 이용해 개별 요소를
문자 방식으로 구문 분석할 수 있어요
반환 값은 true 혹은 false로 변환될 것입니다
부울로 사용할 수도 있습니다 좋은 기능이죠
단어나 문자가 소문자라면
소문자는 참을 반환하죠
여기 좋은 예제가 있어요
전체 문자열에서 글자 수를 세는 거죠
더 명확하게 하기 위해서 실행해 보겠습니다
버퍼를 만들고 있는 게 보이시죠 인풋 버퍼에서
3개의 정수를 만들고 있네요
사용자에게 그렇게 많은 글자보다 적은 문자열을
입력하라고 한 다음 그걸 읽어 넣는 거죠
그런 다음 그 문자열을 보고 특정 문자를
포함하고 있는지 알아보죠
그래서 문자열을 반복할 거예요
배열의 각 인덱스를 보면서요
여기 예제가 있어요
버퍼는 입력을 저장하는 캐릭터
배열이에요 Scanf를 이용해 그걸 채울 거예요
띄어쓰기 없이 문자열을 입력해야 해요 단일 문자열이거든요
버퍼에 있는 각각의 요소를 살펴볼 거예요 그런 다음 i-a-dit
혹은 마침표 함수를 호출해 문자가 있는지 확인합니다 그런
다음 그것에 근거해 증가를 할 거예요
참으로 반환되든 거짓으로 반환되든 간에요 그런 다음 문자열 안에 몇 개의
문자와 숫자, 마침표 문자가 있는지 표시하죠
실행해보죠
대문자로 된 뭔가를 입력할 거예요
숫자 같은 거요
반환을 누르면 모든 걸 다 셀 거예요 조향 장치에는
24개의 글자와 4개의 숫자 그리고 딱지 부호
1개와 콜론이 들어있었죠
문자 함수를 활용하는 멋진 프로그램이지만
문자열 분석에도 유용할 거예요 문자열을
분석하긴 하지만 문자열을 분석하는
거니까요 고마워요