1 00:00:00,000 --> 00:00:02,490 [Powered by Google Translate] [CS50 도서관] 2 00:00:02,490 --> 00:00:04,220 [네이트 Hardison] [하버드 대학] 3 00:00:04,220 --> 00:00:07,260 [이 CS50입니다. CS50.TV] 4 00:00:07,260 --> 00:00:11,510 CS50 라이브러리는 우리가 기기에 설치 한 유용한 도구입니다 5 00:00:11,510 --> 00:00:15,870 당신은 프로그램을 작성하기가 수월하게하려고 입력을위한 프롬프트 사용자가. 6 00:00:15,870 --> 00:00:21,670 이 동영상에서는, 우리는 커튼을 다시 끌어되고 CS50 라이브러리에 정확히 무슨보세요. 7 00:00:21,670 --> 00:00:25,520 >> C 라이브러리에있는 동영상에서는, 우리는 당신 # 헤더 파일을 포함하는 방법에 대해 이야기 8 00:00:25,520 --> 00:00:27,570 소스 코드에서 라이브러리의, 9 00:00:27,570 --> 00:00:31,150 그리고 당신은 연결 단계에서 이진 라이브러리 파일과 연결 10 00:00:31,150 --> 00:00:33,140 컴파일 과정. 11 00:00:33,140 --> 00:00:36,440 헤더 파일은 라이브러리의 인터페이스를 지정합니다. 12 00:00:36,440 --> 00:00:41,280 즉, 사람들이 세부 사용하는 라이브러리를 사용할 수 있다는 리소스를 모두이다 13 00:00:41,280 --> 00:00:45,250 함수 선언, 상수, 데이터 유형처럼. 14 00:00:45,250 --> 00:00:48,890 이진 라이브러리 파일은 라이브러리의 구현을 포함 15 00:00:48,890 --> 00:00:54,580 어떤이 라이브러리의 헤더 파일과 라이브러리. C 소스 코드 파일에서 컴파일됩니다. 16 00:00:54,580 --> 00:00:59,820 >> 이진 라이브러리 파일은 바이너리에 음, 이후를 볼 매우 흥미 없습니다. 17 00:00:59,820 --> 00:01:03,300 자,이 헤더 라이브러리 파일을 대신 살펴 보자. 18 00:01:03,300 --> 00:01:07,710 이 경우 cs50.h.라는 하나의 헤더 파일이있어 19 00:01:07,710 --> 00:01:11,040 우리는 사용자에 설치 한 것은 디렉토리를 포함 20 00:01:11,040 --> 00:01:15,150 다른 시스템 라이브러리 '헤더 파일과 함께. 21 00:01:15,150 --> 00:01:21,530 >> 당신이주의 가장 먼저 것들 중 하나는 cs50.h은 # 다른 도서관에서 헤더 파일을 포함하는 것입니다 - 22 00:01:21,530 --> 00:01:25,670 부동, 한계, 표준 BOOL 및 표준 해방 운동. 23 00:01:25,670 --> 00:01:28,800 다시 휠을 reinventing하지의 원칙에 따라, 24 00:01:28,800 --> 00:01:33,490 우리는 다른 우리 제공된 도구를 사용하여 CS0 라이브러리를 구축했습니다. 25 00:01:33,490 --> 00:01:38,690 >> 당신이 도서관에서 볼 수 있습니다 다음은 우리가라는 새로운 유형의 정의 있다는 것입니다 "문자열을." 26 00:01:38,690 --> 00:01:42,330 이 줄은 정말 그냥 숯불 * 유형에 대한 별칭을 만들어, 27 00:01:42,330 --> 00:01:46,000 그래서 마법 속성을 사용하여 새로운 문자열 유형을 더럽 히다하지 않습니다 28 00:01:46,000 --> 00:01:49,650 일반적으로, 다른 언어로 문자열 객체와 연관된 29 00:01:49,650 --> 00:01:50,850 같은 길이 있습니다. 30 00:01:50,850 --> 00:01:55,180 우리가 이런 짓을 한 이유는 피투성이 세부 사항에서 새 프로그래머를 보호하는 것입니다 31 00:01:55,180 --> 00:01:57,580 포인터의 사람들은 준비가 될 때까지. 32 00:01:57,580 --> 00:02:00,130 >> 헤더 파일의 다음 부분은 함수의 선언입니다 33 00:02:00,130 --> 00:02:04,410 CS50 라이브러리는 문서와 함께 제공. 34 00:02:04,410 --> 00:02:06,940 여기에 댓글 세부 수준을 확인할 수 있습니다. 35 00:02:06,940 --> 00:02:10,560 사람들이 이러한 기능을 사용하는 방법을 알 수 있도록이 중요한 슈퍼입니다. 36 00:02:10,560 --> 00:02:19,150 우리는 차례로, 선언, 사용자와 반환 문자, 더블, 부동 소수점, ints를 묻는 메시지를 표시하도록 기능이 37 00:02:19,150 --> 00:02:24,160 긴은 longs하고, 문자열, 우리 자신의 문자열 유형을 사용합니다. 38 00:02:24,160 --> 00:02:26,260 정보가 숨어의 원칙에 따라, 39 00:02:26,260 --> 00:02:31,640 . 우리는 별도의 C 구현 파일에 우리의 정의를 삽입 한 - cs50.c .. - 40 00:02:31,640 --> 00:02:35,110 사용자 소스 디렉토리에 위치하고 있습니다. 41 00:02:35,110 --> 00:02:38,040 당신이 좀 봐 수 있도록 우리는 그 파일을 제공 42 00:02:38,040 --> 00:02:41,490 여기에서 배우고, 원하는 경우 다른 기계에 컴파일, 43 00:02:41,490 --> 00:02:45,510 우리는이 클래스의 기기에서 작동 더 나을 것 같아요에도 마찬가지입니다. 44 00:02:45,510 --> 00:02:47,580 어쨌든, 지금 살펴 보자. 45 00:02:49,020 --> 00:02:54,620 >> 기능 GetChar, GetDouble, GetFloat, GetInt, 그리고 GetLongLong 46 00:02:54,620 --> 00:02:58,160 모든 GetString 함수의 상단에 내장되어 있습니다. 47 00:02:58,160 --> 00:03:01,510 그 사람들이 모두 기본적으로 같은 패턴을 따르는 것이 밝혀졌다. 48 00:03:01,510 --> 00:03:04,870 그들은 입력 한 줄의 사용자를 묻는 메시지를 표시하도록 잠시 루프를 사용합니다. 49 00:03:04,870 --> 00:03:08,430 그들은 사용자가 입력 빈 줄이있는 경우 특별한 값을 반환합니다. 50 00:03:08,430 --> 00:03:11,750 그들은 적절한 유형으로 사용자의 입력을 구문 분석 시도 51 00:03:11,750 --> 00:03:15,010 그 문자, 더블, 부동 등이 될 52 00:03:15,010 --> 00:03:18,710 입력이 성공적으로 구문 분석 된 경우 그리고 그들도 그 결과를 반환 53 00:03:18,710 --> 00:03:21,330 아니면 사용자를 reprompt. 54 00:03:21,330 --> 00:03:24,230 >> 높은 수준에서, 정말 까다로운 아무것도 없습니다. 55 00:03:24,230 --> 00:03:28,760 당신은 과거에 이와 유사한 구조의 코드를 직접 작성했을 수 있습니다. 56 00:03:28,760 --> 00:03:34,720 아마도 대부분의 암호화 수준 부분은 사용자의 입력을 구문 분석 sscanf 전화입니다. 57 00:03:34,720 --> 00:03:38,160 Sscanf는 입력 형식 변환 가족의 일부입니다. 58 00:03:38,160 --> 00:03:42,300 , 그것은 표준 io.h에 살고있는, 그 일이 C 문자열을 구문 분석하는 것입니다 59 00:03:42,300 --> 00:03:46,520 변수에 구문 분석 결과를 저장, 특정 형식에 따라 60 00:03:46,520 --> 00:03:48,720 호출자에 의해 제공됩니다. 61 00:03:48,720 --> 00:03:53,570 입력 형식 변환 기능은 매우 유용하고 널리 사용되는 기능이므로 62 00:03:53,570 --> 00:03:56,160 처음에는 직관적 인 슈퍼 없습니다 그 63 00:03:56,160 --> 00:03:58,300 우리는 sscanf가 어떻게 작동하는지에 갈거야. 64 00:03:58,300 --> 00:04:03,330 >> sscanf에 대한 첫 번째 인수는 숯불 *입니다 - 문자에 대한 포인터. 65 00:04:03,330 --> 00:04:05,150 기능이 제대로 작동 할 수 66 00:04:05,150 --> 00:04:08,340 그 문자는 C 문자열의 첫 번째 문자 여야합니다 67 00:04:08,340 --> 00:04:12,270 널 \ 0 문자로 종료. 68 00:04:12,270 --> 00:04:15,120 이 해석하는 문자열입니다 69 00:04:15,120 --> 00:04:18,269 sscanf에 대한 두 번째 인수는 형식 문자열입니다 70 00:04:18,269 --> 00:04:20,839 일반적으로 문자열 상수로 전달 71 00:04:20,839 --> 00:04:24,040 그리고 당신은 printf를 사용하는 경우 전에이 같은 문자열을 볼수있을 것이다. 72 00:04:24,040 --> 00:04:28,650 형식 문자열에 % 기호는 변환 지정자를 나타냅니다. 73 00:04:28,650 --> 00:04:30,850 이 캐릭터는 바로 퍼센트 기호에 따라 74 00:04:30,850 --> 00:04:35,430 우리가로 전환 sscanf 할 C 타입 나타냅니다. 75 00:04:35,430 --> 00:04:40,090 GetInt에서, 당신은 % d 개 및 % C가 있다는 것을 참조하십시오. 76 00:04:40,090 --> 00:04:48,690 % D - -와 숯 - %의 C이 sscanf는 진수 int로 시도 할 수 있음을 의미합니다. 77 00:04:48,690 --> 00:04:51,510 형식 문자열의 각 변환 지정자를 들어, 78 00:04:51,510 --> 00:04:56,620 sscanf는 인수 목록에서 해당 인수 후 기대합니다. 79 00:04:56,620 --> 00:05:00,850 그 주장은 적절하게 형식화 된 위치를 가리합니다 80 00:05:00,850 --> 00:05:04,000 전환의 결과를 저장할 수있는 인치 81 00:05:04,000 --> 00:05:08,910 >> 이런 짓을의 전형적인 방법은 sscanf를 호출하기 전에 스택에 변수를 만드는 것입니다 82 00:05:08,910 --> 00:05:11,440 당신은 문자열에서 구문 분석 할 각 항목에 대한 83 00:05:11,440 --> 00:05:15,520 포인터를 전달하는 데 - 앰퍼샌드 - 그리고 주소 연산자를 사용 84 00:05:15,520 --> 00:05:19,100 sscanf를 호출 그 변수에. 85 00:05:19,100 --> 00:05:22,720 당신은 GetInt에서 우리가 정확히이 일을 것을 볼 수 있습니다. 86 00:05:22,720 --> 00:05:28,240 오른쪽 sscanf 호출하기 전에, 우리는 N이라는 INT와 스택에 문자 통화 C를 선언 87 00:05:28,240 --> 00:05:32,340 우리는 sscanf 전화로 그들에게 포인터를 전달합니다. 88 00:05:32,340 --> 00:05:35,800 스택에이 변수를 넣어이 할당 된 공간을 사용하여 선호합니다 89 00:05:35,800 --> 00:05:39,350 당신이 malloc 호출의 오버 헤드를 피하기 때문에 malloc으로 힙에, 90 00:05:39,350 --> 00:05:43,060 당신은 메모리가 누수에 대해 걱정할 필요가 없습니다. 91 00:05:43,060 --> 00:05:47,280 퍼센트 기호가 접두어되지 않는 문자는 전환하라는 메시지를 표시하지 않습니다. 92 00:05:47,280 --> 00:05:50,380 오히려 그냥 형식 사양을 추가 할 수 있습니다. 93 00:05:50,380 --> 00:05:56,500 >> 예를 들어, GetInt의 형식 문자열이 대신 % d 개라면, 94 00:05:56,500 --> 00:05:59,800 sscanf는 정수 다음 문자를 찾을 것입니다 95 00:05:59,800 --> 00:06:04,360 가 INT로 변환하려고 시도 것하면서,이와 다른 아무 짓도하지 것입니다. 96 00:06:04,360 --> 00:06:07,440 이 문제에 대한 유일한 예외는 공백​​입니다. 97 00:06:07,440 --> 00:06:11,030 형식 문자열에 공백 문자는 공백의 금액과 일치 - 98 00:06:11,030 --> 00:06:12,890 전혀도 없음. 99 00:06:12,890 --> 00:06:18,100 댓글이 선도 및 / 또는 공백을 후행와 가능성이 언급 그래서, 그게. 100 00:06:18,100 --> 00:06:22,910 그래서, 우리의 sscanf 통화 모양이 시점에서 사용자의 입력 문자열을 구문 분석하려고합니다 101 00:06:22,910 --> 00:06:25,380 가능한 최고의 공백을 확인하여, 102 00:06:25,380 --> 00:06:29,300 INT 변수 N에 변환되어 저장됩니다 INT 다음 103 00:06:29,300 --> 00:06:33,090 공백의 일부 금액을 다음과 문자 다음 104 00:06:33,090 --> 00:06:35,810 문자 변수 C에 저장됩니다. 105 00:06:35,810 --> 00:06:37,790 >> 반환 값은 어때? 106 00:06:37,790 --> 00:06:41,560 Sscanf은 처음부터 끝까지 입력 행의 구문을 분석합니다 107 00:06:41,560 --> 00:06:44,860 입력에서 문자를 그 끝을 도달 할 때 중지하거나 108 00:06:44,860 --> 00:06:49,320 형식 문자와 일치하지 않는거나 전환 할 수없는 경우. 109 00:06:49,320 --> 00:06:52,690 그건 반환 값은이 중지되었을 때 싱글하는 데 사용됩니다. 110 00:06:52,690 --> 00:06:55,670 이 입력 문자열의 끝을 도달하기 때문에이 중단 된 경우 111 00:06:55,670 --> 00:07:00,630 어떤 전환을하기 전에하고 형식 문자열의 일부를 일치시키지 못하는 전에, 112 00:07:00,630 --> 00:07:04,840 다음 특수 상수 EOF가 반환됩니다. 113 00:07:04,840 --> 00:07:08,200 그렇지 않으면, 그것은 성공적인 전환 수를 반환 114 00:07:08,200 --> 00:07:14,380 우리 두 전환 요청했기 때문에 이것은, 0, 1, 또는 2가 될 수 있습니다. 115 00:07:14,380 --> 00:07:19,000 우리의 경우, 우리는 사용자가 INT 만 INT에 입력되었는지 확인하고 싶습니다. 116 00:07:19,000 --> 00:07:23,370 >> 그래서, 우리는 우리가 sscanf 1을 반환하고 싶습니다. 왜 봐? 117 00:07:23,370 --> 00:07:26,850 sscanf는 0을 반환한다면, 아무도 개종 사항이 없습니다, 118 00:07:26,850 --> 00:07:31,690 따라서 사용자가 입력의 시작 부분에 정수가 아닌 다른 무언가를 입력. 119 00:07:31,690 --> 00:07:37,100 sscanf는 2를 반환하면 사용자가 제대로, 입력의 시작 부분에서 그것을에서 입력 않았습니다 120 00:07:37,100 --> 00:07:41,390 하지만 그 후에도 몇 가지 공백이 아닌 문자를 입력 121 00:07:41,390 --> 00:07:44,940 % 이후 C 변환에 성공했습니다. 122 00:07:44,940 --> 00:07:49,570 와우, 아주 하나의 함수 호출에 대한 긴 설명입니다. 123 00:07:49,570 --> 00:07:53,460 어쨌든, 당신은 sscanf와 형제에 대한 자세한 정보를 원하는 경우, 124 00:07:53,460 --> 00:07:57,130 맨 페이지, 구글, 또는 두 가지 모두를 확인하시기 바랍니다. 125 00:07:57,130 --> 00:07:58,780 포맷 스트링 옵션을 많이가 있습니다 126 00:07:58,780 --> 00:08:03,830 C.에 문자열을 구문 분석 할 때 이러한 너에게 육체 노동을 많이 절약 할 수 있습니다 127 00:08:03,830 --> 00:08:07,180 >> 에서 찾을 수있는 도서관의 최종 기능은 GetString입니다. 128 00:08:07,180 --> 00:08:10,310 그것은 GetString가 제대로 작성하는 복잡한 함수는 것이 밝혀 129 00:08:10,310 --> 00:08:14,290 이건 정말 간단하고 일반적인 작업처럼 보인다하더라도. 130 00:08:14,290 --> 00:08:16,170 왜이 사건입니까? 131 00:08:16,170 --> 00:08:21,380 음, 어떻게 우리가 선을 저장하는 것 생각해 보죠 그 인치 사용자는 유형 132 00:08:21,380 --> 00:08:23,880 문자열은 문자의 순서입니다, 때문에 133 00:08:23,880 --> 00:08:26,430 우리는 스택에 배열에 저장 할 수도 있습니다 134 00:08:26,430 --> 00:08:31,250 우리는 우리가 그것을 선언 할 때 배열이 될 것입니다 얼마나 알고해야합니다. 135 00:08:31,250 --> 00:08:34,030 마찬가지로, 우리는 힙에 넣어하려는 경우, 136 00:08:34,030 --> 00:08:38,090 우리는 malloc하기 위해 할 예약 할 바이트의 수를 통과해야 137 00:08:38,090 --> 00:08:39,730 하지만이 불가능합니다. 138 00:08:39,730 --> 00:08:42,760 우리는 사용자가 입력됩니다 얼마나 많은 문자 몰라 139 00:08:42,760 --> 00:08:46,590 사용자가 실제로 입력하기 전에 어떤. 140 00:08:46,590 --> 00:08:50,720 >> 이 문제에 대한 순진 솔루션은 단지 공간의 큰 덩어리를 예약 말 것입니다 141 00:08:50,720 --> 00:08:54,540 사용자의 입력을위한 1000 문자의 블록, 142 00:08:54,540 --> 00:08:57,980 사용자가 그렇게 오래 문자열 입력하지 않을 것이라고 가정. 143 00:08:57,980 --> 00:09:00,810 이 두 가지 이유에 대한 좋은 생각입니다. 144 00:09:00,810 --> 00:09:05,280 먼저, 사용자가 일반적으로 그 긴 문자열에 입력하지 않는 가정 145 00:09:05,280 --> 00:09:07,610 당신은 많은 메모리를 낭비 수 있습니다. 146 00:09:07,610 --> 00:09:10,530 이렇게하면 현대적인 기계에서이 문제가되지 않을 수도 있습니다 147 00:09:10,530 --> 00:09:13,890 하나 또는 두 개의 분리 된 경우에, 148 00:09:13,890 --> 00:09:17,630 하지만 루프에서 사용자의 입력을 복용하고 나중에 사용하기 위해 저장하는 경우, 149 00:09:17,630 --> 00:09:20,870 당신은 신속하게 메모리의 톤을 빨아 수 있습니다. 150 00:09:20,870 --> 00:09:24,450 또한, 경우 작성하는 프로그램은 작은 컴퓨터입니다 - 151 00:09:24,450 --> 00:09:28,100 제한된 메모리와 스마트 폰 아니면 다른 문제가 같은 기기 - 152 00:09:28,100 --> 00:09:32,060 이 솔루션은 훨씬 빨리 문제가 발생합니다. 153 00:09:32,060 --> 00:09:36,450 이 작업을 수행하지 않는 두 번째, 더 심각한 이유는 취약한 프로그램을 떠나는 것입니다 154 00:09:36,450 --> 00:09:39,710 버퍼 오버플로 공격이란 있습니다. 155 00:09:39,710 --> 00:09:45,840 프로그래밍에서, 버퍼는 일시적으로 입력 또는 출력 데이터를 저장하는 데 사용 메모리 156 00:09:45,840 --> 00:09:48,980 이 경우에 우리의 1000 숯불 블록하는 것입니다. 157 00:09:48,980 --> 00:09:53,370 데이터 블록의 끝을 지났 기록 할 때 버퍼 오버 플로우가 발생합니다. 158 00:09:53,370 --> 00:09:57,790 >> 예를 들어, 사용자가 실제로 1000 개 이상의 문자를 입력을하면. 159 00:09:57,790 --> 00:10:01,570 배열을 프로그래밍 할 때 실수를 경험했을 수 있습니다. 160 00:10:01,570 --> 00:10:05,620 가 10 ints의 배열이있을 경우, 아무 읽거나 쓰려고에서 당신을 중지하지 161 00:10:05,620 --> 00:10:07,810 15 INT. 162 00:10:07,810 --> 00:10:10,000 더 컴파일러 경고 나 오류가 없습니다. 163 00:10:10,000 --> 00:10:13,250 이 프로그램은 똑바로 실수와 메모리에 액세스 164 00:10:13,250 --> 00:10:18,150 이 생각하는 15 INT는 될 것이며,이 다른 변수를 덮어 쓸 수 있습니다. 165 00:10:18,150 --> 00:10:22,040 최악의 경우, 당신은 프로그램의 내부의 일부를 덮어 쓸 수 166 00:10:22,040 --> 00:10:26,820 제어 메커니즘은 프로그램을 일으키는 것은 실제로 서로 다른 방법을 실행하도록 167 00:10:26,820 --> 00:10:28,340 당신은 예정보다. 168 00:10:28,340 --> 00:10:31,360 >> 이제, 실수로이 작업을 수행 할 일반적인 아닙니다 169 00:10:31,360 --> 00:10:35,150 하지만 나쁜 사람들이 프로그램을 아프게하는 데 사용되는 매우 일반적인 기술이다 170 00:10:35,150 --> 00:10:39,080 그리고 다른 사람의 컴퓨터에 악성 코드를 삽입. 171 00:10:39,080 --> 00:10:42,910 따라서, 우리는 우리의 순진 솔루션을 사용할 수 없습니다. 172 00:10:42,910 --> 00:10:45,590 우리는 취약한되는 것을 우리의 프로그램을 방지 할 수있는 방법이 필요합니다 173 00:10:45,590 --> 00:10:47,880 버퍼 오버플로 공격합니다. 174 00:10:47,880 --> 00:10:51,430 이 작업을 수행하기 위해, 우리는 우리가 읽은 상태로 우리의 버퍼가 성장할 수 있는지 확인해야합니다 175 00:10:51,430 --> 00:10:53,850 사용자의 추가 정보를 입력. 176 00:10:53,850 --> 00:10:57,440 솔루션? 우리는 힙 할당 버퍼를 사용합니다. 177 00:10:57,440 --> 00:10:59,950 우리가 크기를 조정할 수 있기 때문에 그것은 크기 조정에게 realloc 함수를 사용 178 00:10:59,950 --> 00:11:04,580 우리는 두 숫자를 추적 - 다음 빈 슬롯의 색인을 버퍼에 179 00:11:04,580 --> 00:11:08,390 그리고 길이 또는 버퍼의 용량. 180 00:11:08,390 --> 00:11:13,210 우리는 fgetc 함수를 사용하여 한 번에 사용자가 하나에서 문자로 읽어보십시오. 181 00:11:13,210 --> 00:11:19,360 표준 입력 - - fgetc 함수가 소요되는 인수는, 표준 입력 문자열에 대한 참조입니다 182 00:11:19,360 --> 00:11:23,810 이는 사용자의 입력을 전송하는 데 사용됩니다 preconnected 입력 채널입니다 183 00:11:23,810 --> 00:11:26,270 터미널에서 프로그램. 184 00:11:26,270 --> 00:11:29,890 >> 때마다 새로운 캐릭터의 사용자가 유형, 우리는 확인되는 경우 색인 185 00:11:29,890 --> 00:11:35,810 다음 무료 슬롯 플러스 1 버퍼의 용량보다 큽니다. 186 00:11:35,810 --> 00:11:39,690 +1, 다음 무료 지수가 5 인 경우 때문으로 제공 187 00:11:39,690 --> 00:11:44,150 그러면 우리 버퍼의 길이는 6 감사 영 색인을 생성하는 것이어야합니다. 188 00:11:44,150 --> 00:11:48,350 우리가 버퍼에 공간이 부족했다면, 우리는 크기를 조정하려고 시도 189 00:11:48,350 --> 00:11:51,690 우리가 크기를 조정하는 것이 횟수를 줄일 수 있도록 그것을 배로 증가 190 00:11:51,690 --> 00:11:54,760 사용자가 정말 긴 문자열을 입력하는 경우. 191 00:11:54,760 --> 00:11:57,950 문자열이 너무 깁니다 얻었다 또는 우리가 힙 메모리가 부족하면 경우는, 192 00:11:57,950 --> 00:12:01,350 우리는 버퍼와 반환 null을 확보. 193 00:12:01,350 --> 00:12:04,170 >> 마지막으로, 우리는 버퍼에 문자를 추가합니다. 194 00:12:04,170 --> 00:12:08,200 사용자 조회는 입력 또는 반환, 새 줄을 신호 한 번 195 00:12:08,200 --> 00:12:12,050 또는 특수 문자 - 제어 D - 입력의 끝을 신호, 196 00:12:12,050 --> 00:12:16,240 우리는 사용자가 실제로 아무 것도 입력하면 볼 수있는 체크 해. 197 00:12:16,240 --> 00:12:18,820 그렇지 않을 경우, 우리는 null 반환합니다. 198 00:12:18,820 --> 00:12:22,280 그렇지 않으면, 우리의 버퍼가 우리가 필요로하는 것보다 아마도 크기 때문에하면, 199 00:12:22,280 --> 00:12:24,830 최악의 경우 우리가 필요한만큼 거의 두 배나 크고 200 00:12:24,830 --> 00:12:27,830 우리는 크기를 조정할 때마다 두 번, 이후 201 00:12:27,830 --> 00:12:31,840 우리는 우리가 필요로하는 공간의 단지 양을 사용하여 문자열의 새 복사본을 만드십시오. 202 00:12:31,840 --> 00:12:34,220 우리는 malloc 호출에 추가 1 추가 203 00:12:34,220 --> 00:12:37,810 \ 0 - 특별 널 종료 문자를위한 공간이 있도록 204 00:12:37,810 --> 00:12:41,990 어떤 우리가 문자의 나머지 부분에 복사되면 우리가 문자열에 추가, 205 00:12:41,990 --> 00:12:45,060 대신에 strcpy의 strncpy를 사용하여 206 00:12:45,060 --> 00:12:48,830 수 있도록 우리는 우리가 복사 할 정확히 얼마나 많은 문자를 지정할 수 있습니다. 207 00:12:48,830 --> 00:12:51,690 그것이 \ 0에 도달 할 때까지 Strcpy가 복사됩니다. 208 00:12:51,690 --> 00:12:55,740 그런 다음 우리는 버퍼를 확보 한 후 호출자에게 복사본을 반환합니다. 209 00:12:55,740 --> 00:12:59,840 >> 누구는 간단하게 보이는 기능이 너무 복잡 할 수 알고? 210 00:12:59,840 --> 00:13:02,820 이제 CS50 도서관을 다 아는. 211 00:13:02,820 --> 00:13:06,470 >> 내 이름은 네이트 Hardison 있으며,이 CS50입니다. 212 00:13:06,470 --> 00:13:08,350 [CS50.TV]