1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> COLUMNA 1: Imos escribir un programa que recibe unha cadea do usuario sen 3 00:00:02,920 --> 00:00:05,700 usar o CS50 Biblioteca de GetString funcionar. 4 00:00:05,700 --> 00:00:08,720 Para iso, imos adiante e utilizar scanf, a función que o GetString 5 00:00:08,720 --> 00:00:10,950 función realmente usa debaixo do capó. 6 00:00:10,950 --> 00:00:13,780 Pero eu vou facelo deliberadamente dunha forma buggy. 7 00:00:13,780 --> 00:00:17,230 Vou facer dun xeito que eu creo que estaría ben, pero verifícase que 8 00:00:17,230 --> 00:00:19,380 miña suposición vai ser moi, moi fallo. 9 00:00:19,380 --> 00:00:20,800 E, de feito, moi perigoso. 10 00:00:20,800 --> 00:00:24,750 Porque erros como o que eu estou a punto de facer pode ser explotada por adversarios 11 00:00:24,750 --> 00:00:28,870 de tal forma que a máquina ou o seu programa pode ser tomado potencialmente. 12 00:00:28,870 --> 00:00:30,200 >> Imos comezar a continuación. 13 00:00:30,200 --> 00:00:33,540 Primeiro imos declarar nosa corda, tamén coñecido agora como unha estrela char, 14 00:00:33,540 --> 00:00:34,750 e chamalo s. 15 00:00:34,750 --> 00:00:39,400 Deixa o próximo solicitar ao usuario unha cadea, como con "corda por favor." E 16 00:00:39,400 --> 00:00:44,250 imos agora obter a secuencia do usuario usando scanf, entre comiñas, "% s". En 17 00:00:44,250 --> 00:00:47,760 É dicir, imos informar scanf que que, de feito, espera obter unha cadea 18 00:00:47,760 --> 00:00:48,630 desde o sitio web. 19 00:00:48,630 --> 00:00:50,810 >> Pero agora necesitamos dicir scanf outra cousa - 20 00:00:50,810 --> 00:00:53,350 onde poñer a cadea que o usuario ofrece. 21 00:00:53,350 --> 00:00:57,840 Ben, eu vou simplemente comezar con comas s, especificando que me gustaría 22 00:00:57,840 --> 00:00:59,320 scanf para poñer a corda alí. 23 00:00:59,320 --> 00:01:04,818 Estou próximo vai imprimir algo como printf "grazas por% s 24 00:01:04,818 --> 00:01:10,670 barra invertida n coma. "E, como sempre, eu son vai pasar na secuencia, s. 25 00:01:10,670 --> 00:01:14,920 Agora imos gardar, compilar e executar este programa, e vexa se non podemos inducir 26 00:01:14,920 --> 00:01:16,590 o problema que eu prevía. 27 00:01:16,590 --> 00:01:18,650 >> Fai scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 Cadea por favor. 30 00:01:21,830 --> 00:01:25,540 Imos ofrecer algo así como: "Ola". "Grazas polo nulo." Hmm, iso non é 31 00:01:25,540 --> 00:01:26,750 o que eu estaba esperando. 32 00:01:26,750 --> 00:01:28,240 Entón o que está pasando aquí? 33 00:01:28,240 --> 00:01:32,040 >> Ben, ao parecer, xa declaramos s como unha estrela de char pero non o fixemos 34 00:01:32,040 --> 00:01:36,120 efectivamente almacenados no s a dirección dun peza real de memoria, scanf non 35 00:01:36,120 --> 00:01:38,940 ten en calquera lugar para poñer a cadea que o usuario inseriu dentro 36 00:01:38,940 --> 00:01:42,510 Efectivamente, se o usuario fose tipo agora en un tempo moito maior que cadea "Ola", 37 00:01:42,510 --> 00:01:46,780 por exemplo, varias liñas de texto ou varios parágrafos do texto, é moi 38 00:01:46,780 --> 00:01:50,280 posible que poidamos inducir un chamado fallo de segmento. 39 00:01:50,280 --> 00:01:53,570 >> Porque scanf non vai saber que Realmente non teño colocar un enderezo 40 00:01:53,570 --> 00:01:54,610 dentro de s. 41 00:01:54,610 --> 00:01:58,000 Pola contra, vai ver algún valor en s, algún patrón de bits que pode 42 00:01:58,000 --> 00:02:00,910 moi ben ser un valor de lixo, non só por casualidade. 43 00:02:00,910 --> 00:02:04,600 E scanf aínda vai tentar escribir a cadea user a este enderezo, 44 00:02:04,600 --> 00:02:08,789 mesmo se é un valor de lixo, que podería de feito inducir un accidente. 45 00:02:08,789 --> 00:02:10,130 >> Entón, como é que imos solucionar isto? 46 00:02:10,130 --> 00:02:12,523