[Powered by Google Translate] [CS50 도서관]
[네이트 Hardison] [하버드 대학]
[이 CS50입니다. CS50.TV]
CS50 라이브러리는 우리가 기기에 설치 한 유용한 도구입니다
당신은 프로그램을 작성하기가 수월하게하려고 입력을위한 프롬프트 사용자가.
이 동영상에서는, 우리는 커튼을 다시 끌어되고 CS50 라이브러리에 정확히 무슨보세요.
>> C 라이브러리에있는 동영상에서는, 우리는 당신 # 헤더 파일을 포함하는 방법에 대해 이야기
소스 코드에서 라이브러리의,
그리고 당신은 연결 단계에서 이진 라이브러리 파일과 연결
컴파일 과정.
헤더 파일은 라이브러리의 인터페이스를 지정합니다.
즉, 사람들이 세부 사용하는 라이브러리를 사용할 수 있다는 리소스를 모두이다
함수 선언, 상수, 데이터 유형처럼.
이진 라이브러리 파일은 라이브러리의 구현을 포함
어떤이 라이브러리의 헤더 파일과 라이브러리. C 소스 코드 파일에서 컴파일됩니다.
>> 이진 라이브러리 파일은 바이너리에 음, 이후를 볼 매우 흥미 없습니다.
자,이 헤더 라이브러리 파일을 대신 살펴 보자.
이 경우 cs50.h.라는 하나의 헤더 파일이있어
우리는 사용자에 설치 한 것은 디렉토리를 포함
다른 시스템 라이브러리 '헤더 파일과 함께.
>> 당신이주의 가장 먼저 것들 중 하나는 cs50.h은 # 다른 도서관에서 헤더 파일을 포함하는 것입니다 -
부동, 한계, 표준 BOOL 및 표준 해방 운동.
다시 휠을 reinventing하지의 원칙에 따라,
우리는 다른 우리 제공된 도구를 사용하여 CS0 라이브러리를 구축했습니다.
>> 당신이 도서관에서 볼 수 있습니다 다음은 우리가라는 새로운 유형의 정의 있다는 것입니다 "문자열을."
이 줄은 정말 그냥 숯불 * 유형에 대한 별칭을 만들어,
그래서 마법 속성을 사용하여 새로운 문자열 유형을 더럽 히다하지 않습니다
일반적으로, 다른 언어로 문자열 객체와 연관된
같은 길이 있습니다.
우리가 이런 짓을 한 이유는 피투성이 세부 사항에서 새 프로그래머를 보호하는 것입니다
포인터의 사람들은 준비가 될 때까지.
>> 헤더 파일의 다음 부분은 함수의 선언입니다
CS50 라이브러리는 문서와 함께 제공.
여기에 댓글 세부 수준을 확인할 수 있습니다.
사람들이 이러한 기능을 사용하는 방법을 알 수 있도록이 중요한 슈퍼입니다.
우리는 차례로, 선언, 사용자와 반환 문자, 더블, 부동 소수점, ints를 묻는 메시지를 표시하도록 기능이
긴은 longs하고, 문자열, 우리 자신의 문자열 유형을 사용합니다.
정보가 숨어의 원칙에 따라,
. 우리는 별도의 C 구현 파일에 우리의 정의를 삽입 한 - cs50.c .. -
사용자 소스 디렉토리에 위치하고 있습니다.
당신이 좀 봐 수 있도록 우리는 그 파일을 제공
여기에서 배우고, 원하는 경우 다른 기계에 컴파일,
우리는이 클래스의 기기에서 작동 더 나을 것 같아요에도 마찬가지입니다.
어쨌든, 지금 살펴 보자.
>> 기능 GetChar, GetDouble, GetFloat, GetInt, 그리고 GetLongLong
모든 GetString 함수의 상단에 내장되어 있습니다.
그 사람들이 모두 기본적으로 같은 패턴을 따르는 것이 밝혀졌다.
그들은 입력 한 줄의 사용자를 묻는 메시지를 표시하도록 잠시 루프를 사용합니다.
그들은 사용자가 입력 빈 줄이있는 경우 특별한 값을 반환합니다.
그들은 적절한 유형으로 사용자의 입력을 구문 분석 시도
그 문자, 더블, 부동 등이 될
입력이 성공적으로 구문 분석 된 경우 그리고 그들도 그 결과를 반환
아니면 사용자를 reprompt.
>> 높은 수준에서, 정말 까다로운 아무것도 없습니다.
당신은 과거에 이와 유사한 구조의 코드를 직접 작성했을 수 있습니다.
아마도 대부분의 암호화 수준 부분은 사용자의 입력을 구문 분석 sscanf 전화입니다.
Sscanf는 입력 형식 변환 가족의 일부입니다.
, 그것은 표준 io.h에 살고있는, 그 일이 C 문자열을 구문 분석하는 것입니다
변수에 구문 분석 결과를 저장, 특정 형식에 따라
호출자에 의해 제공됩니다.
입력 형식 변환 기능은 매우 유용하고 널리 사용되는 기능이므로
처음에는 직관적 인 슈퍼 없습니다 그
우리는 sscanf가 어떻게 작동하는지에 갈거야.
>> sscanf에 대한 첫 번째 인수는 숯불 *입니다 - 문자에 대한 포인터.
기능이 제대로 작동 할 수
그 문자는 C 문자열의 첫 번째 문자 여야합니다
널 \ 0 문자로 종료.
이 해석하는 문자열입니다
sscanf에 대한 두 번째 인수는 형식 문자열입니다
일반적으로 문자열 상수로 전달
그리고 당신은 printf를 사용하는 경우 전에이 같은 문자열을 볼수있을 것이다.
형식 문자열에 % 기호는 변환 지정자를 나타냅니다.
이 캐릭터는 바로 퍼센트 기호에 따라
우리가로 전환 sscanf 할 C 타입 나타냅니다.
GetInt에서, 당신은 % d 개 및 % C가 있다는 것을 참조하십시오.
% D - -와 숯 - %의 C이 sscanf는 진수 int로 시도 할 수 있음을 의미합니다.
형식 문자열의 각 변환 지정자를 들어,
sscanf는 인수 목록에서 해당 인수 후 기대합니다.
그 주장은 적절하게 형식화 된 위치를 가리합니다
전환의 결과를 저장할 수있는 인치
>> 이런 짓을의 전형적인 방법은 sscanf를 호출하기 전에 스택에 변수를 만드는 것입니다
당신은 문자열에서 구문 분석 할 각 항목에 대한
포인터를 전달하는 데 - 앰퍼샌드 - 그리고 주소 연산자를 사용
sscanf를 호출 그 변수에.
당신은 GetInt에서 우리가 정확히이 일을 것을 볼 수 있습니다.
오른쪽 sscanf 호출하기 전에, 우리는 N이라는 INT와 스택에 문자 통화 C를 선언
우리는 sscanf 전화로 그들에게 포인터를 전달합니다.
스택에이 변수를 넣어이 할당 된 공간을 사용하여 선호합니다
당신이 malloc 호출의 오버 헤드를 피하기 때문에 malloc으로 힙에,
당신은 메모리가 누수에 대해 걱정할 필요가 없습니다.
퍼센트 기호가 접두어되지 않는 문자는 전환하라는 메시지를 표시하지 않습니다.
오히려 그냥 형식 사양을 추가 할 수 있습니다.
>> 예를 들어, GetInt의 형식 문자열이 대신 % d 개라면,
sscanf는 정수 다음 문자를 찾을 것입니다
가 INT로 변환하려고 시도 것하면서,이와 다른 아무 짓도하지 것입니다.
이 문제에 대한 유일한 예외는 공백​​입니다.
형식 문자열에 공백 문자는 공백의 금액과 일치 -
전혀도 없음.
댓글이 선도 및 / 또는 공백을 후행와 가능성이 언급 그래서, 그게.
그래서, 우리의 sscanf 통화 모양이 시점에서 사용자의 입력 문자열을 구문 분석하려고합니다
가능한 최고의 공백을 확인하여,
INT 변수 N에 변환되어 저장됩니다 INT 다음
공백의 일부 금액을 다음과 문자 다음
문자 변수 C에 저장됩니다.
>> 반환 값은 어때?
Sscanf은 처음부터 끝까지 입력 행의 구문을 분석합니다
입력에서 문자를 그 끝을 도달 할 때 중지하거나
형식 문자와 일치하지 않는거나 전환 할 수없는 경우.
그건 반환 값은이 중지되었을 때 싱글하는 데 사용됩니다.
이 입력 문자열의 끝을 도달하기 때문에이 중단 된 경우
어떤 전환을하기 전에하고 형식 문자열의 일부를 일치시키지 못하는 전에,
다음 특수 상수 EOF가 반환됩니다.
그렇지 않으면, 그것은 성공적인 전환 수를 반환
우리 두 전환 요청했기 때문에 이것은, 0, 1, 또는 2가 될 수 있습니다.
우리의 경우, 우리는 사용자가 INT 만 INT에 입력되었는지 확인하고 싶습니다.
>> 그래서, 우리는 우리가 sscanf 1을 반환하고 싶습니다. 왜 봐?
sscanf는 0을 반환한다면, 아무도 개종 사항이 없습니다,
따라서 사용자가 입력의 시작 부분에 정수가 아닌 다른 무언가를 입력.
sscanf는 2를 반환하면 사용자가 제대로, 입력의 시작 부분에서 그것을에서 입력 않았습니다
하지만 그 후에도 몇 가지 공백이 아닌 문자를 입력
% 이후 C 변환에 성공했습니다.
와우, 아주 하나의 함수 호출에 대한 긴 설명입니다.
어쨌든, 당신은 sscanf와 형제에 대한 자세한 정보를 원하는 경우,
맨 페이지, 구글, 또는 두 가지 모두를 확인하시기 바랍니다.
포맷 스트링 옵션을 많이가 있습니다
C.에 문자열을 구문 분석 할 때 이러한 너에게 육체 노동을 많이 절약 할 수 있습니다
>> 에서 찾을 수있는 도서관의 최종 기능은 GetString입니다.
그것은 GetString가 제대로 작성하는 복잡한 함수는 것이 밝혀
이건 정말 간단하고 일반적인 작업처럼 보인다하더라도.
왜이 사건입니까?
음, 어떻게 우리가 선을 저장하는 것 생각해 보죠 그 인치 사용자는 유형
문자열은 문자의 순서입니다, 때문에
우리는 스택에 배열에 저장 할 수도 있습니다
우리는 우리가 그것을 선언 할 때 배열이 될 것입니다 얼마나 알고해야합니다.
마찬가지로, 우리는 힙에 넣어하려는 경우,
우리는 malloc하기 위해 할 예약 할 바이트의 수를 통과해야
하지만이 불가능합니다.
우리는 사용자가 입력됩니다 얼마나 많은 문자 몰라
사용자가 실제로 입력하기 전에 어떤.
>> 이 문제에 대한 순진 솔루션은 단지 공간의 큰 덩어리를 예약 말 것입니다
사용자의 입력을위한 1000 문자의 블록,
사용자가 그렇게 오래 문자열 입력하지 않을 것이라고 가정.
이 두 가지 이유에 대한 좋은 생각입니다.
먼저, 사용자가 일반적으로 그 긴 문자열에 입력하지 않는 가정
당신은 많은 메모리를 낭비 수 있습니다.
이렇게하면 현대적인 기계에서이 문제가되지 않을 수도 있습니다
하나 또는 두 개의 분리 된 경우에,
하지만 루프에서 사용자의 입력을 복용하고 나중에 사용하기 위해 저장하는 경우,
당신은 신속하게 메모리의 톤을 빨아 수 있습니다.
또한, 경우 작성하는 프로그램은 작은 컴퓨터입니다 -
제한된 메모리와 스마트 폰 아니면 다른 문제가 같은 기기 -
이 솔루션은 훨씬 빨리 문제가 발생합니다.
이 작업을 수행하지 않는 두 번째, 더 심각한 이유는 취약한 프로그램을 떠나는 것입니다
버퍼 오버플로 공격이란 있습니다.
프로그래밍에서, 버퍼는 일시적으로 입력 또는 출력 데이터를 저장하는 데 사용 메모리
이 경우에 우리의 1000 숯불 블록하는 것입니다.
데이터 블록의 끝을 지났 기록 할 때 버퍼 오버 플로우가 발생합니다.
>> 예를 들어, 사용자가 실제로 1000 개 이상의 문자를 입력을하면.
배열을 프로그래밍 할 때 실수를 경험했을 수 있습니다.
가 10 ints의 배열이있을 경우, 아무 읽거나 쓰려고에서 당신을 중지하지
15 INT.
더 컴파일러 경고 나 오류가 없습니다.
이 프로그램은 똑바로 실수와 메모리에 액세스
이 생각하는 15 INT는 될 것이며,이 다른 변수를 덮어 쓸 수 있습니다.
최악의 경우, 당신은 프로그램의 내부의 일부를 덮어 쓸 수
제어 메커니즘은 프로그램을 일으키는 것은 실제로 서로 다른 방법을 실행하도록
당신은 예정보다.
>> 이제, 실수로이 작업을 수행 할 일반적인 아닙니다
하지만 나쁜 사람들이 프로그램을 아프게하는 데 사용되는 매우 일반적인 기술이다
그리고 다른 사람의 컴퓨터에 악성 코드를 삽입.
따라서, 우리는 우리의 순진 솔루션을 사용할 수 없습니다.
우리는 취약한되는 것을 우리의 프로그램을 방지 할 수있는 방법이 필요합니다
버퍼 오버플로 공격합니다.
이 작업을 수행하기 위해, 우리는 우리가 읽은 상태로 우리의 버퍼가 성장할 수 있는지 확인해야합니다
사용자의 추가 정보를 입력.
솔루션? 우리는 힙 할당 버퍼를 사용합니다.
우리가 크기를 조정할 수 있기 때문에 그것은 크기 조정에게 realloc 함수를 사용
우리는 두 숫자를 추적 - 다음 빈 슬롯의 색인을 버퍼에
그리고 길이 또는 버퍼의 용량.
우리는 fgetc 함수를 사용하여 한 번에 사용자가 하나에서 문자로 읽어보십시오.
표준 입력 - - fgetc 함수가 소요되는 인수는, 표준 입력 문자열에 대한 참조입니다
이는 사용자의 입력을 전송하는 데 사용됩니다 preconnected 입력 채널입니다
터미널에서 프로그램.
>> 때마다 새로운 캐릭터의 사용자가 유형, 우리는 확인되는 경우 색인
다음 무료 슬롯 플러스 1 버퍼의 용량보다 큽니다.
+1, 다음 무료 지수가 5 인 경우 때문으로 제공
그러면 우리 버퍼의 길이는 6 감사 영 색인을 생성하는 것이어야합니다.
우리가 버퍼에 공간이 부족했다면, 우리는 크기를 조정하려고 시도
우리가 크기를 조정하는 것이 횟수를 줄일 수 있도록 그것을 배로 증가
사용자가 정말 긴 문자열을 입력하는 경우.
문자열이 너무 깁니다 얻었다 또는 우리가 힙 메모리가 부족하면 경우는,
우리는 버퍼와 반환 null을 확보.
>> 마지막으로, 우리는 버퍼에 문자를 추가합니다.
사용자 조회는 입력 또는 반환, 새 줄을 신호 한 번
또는 특수 문자 - 제어 D - 입력의 끝을 신호,
우리는 사용자가 실제로 아무 것도 입력하면 볼 수있는 체크 해.
그렇지 않을 경우, 우리는 null 반환합니다.
그렇지 않으면, 우리의 버퍼가 우리가 필요로하는 것보다 아마도 크기 때문에하면,
최악의 경우 우리가 필요한만큼 거의 두 배나 크고
우리는 크기를 조정할 때마다 두 번, 이후
우리는 우리가 필요로하는 공간의 단지 양을 사용하여 문자열의 새 복사본을 만드십시오.
우리는 malloc 호출에 추가 1 추가
\ 0 - 특별 널 종료 문자를위한 공간이 있도록
어떤 우리가 문자의 나머지 부분에 복사되면 우리가 문자열에 추가,
대신에 strcpy의 strncpy를 사용하여
수 있도록 우리는 우리가 복사 할 정확히 얼마나 많은 문자를 지정할 수 있습니다.
그것이 \ 0에 도달 할 때까지 Strcpy가 복사됩니다.
그런 다음 우리는 버퍼를 확보 한 후 호출자에게 복사본을 반환합니다.
>> 누구는 간단하게 보이는 기능이 너무 복잡 할 수 알고?
이제 CS50 도서관을 다 아는.
>> 내 이름은 네이트 Hardison 있으며,이 CS50입니다.
[CS50.TV]