COLUMNA 1: Imos escribir un programa que recibe unha cadea do usuario sen usar o CS50 Biblioteca de GetString funcionar. Para iso, imos adiante e utilizar scanf, a función que o GetString función realmente usa debaixo do capó. Pero eu vou facelo deliberadamente dunha forma buggy. Vou facer dun xeito que eu creo que estaría ben, pero verifícase que miña suposición vai ser moi, moi fallo. E, de feito, moi perigoso. Porque erros como o que eu estou a punto de facer pode ser explotada por adversarios de tal forma que a máquina ou o seu programa pode ser tomado potencialmente. Imos comezar a continuación. Primeiro imos declarar nosa corda, tamén coñecido agora como unha estrela char, e chamalo s. Deixa o próximo solicitar ao usuario unha cadea, como con "corda por favor." E imos agora obter a secuencia do usuario usando scanf, entre comiñas, "% s". En É dicir, imos informar scanf que que, de feito, espera obter unha cadea desde o sitio web. Pero agora necesitamos dicir scanf outra cousa - onde poñer a cadea que o usuario ofrece. Ben, eu vou simplemente comezar con comas s, especificando que me gustaría scanf para poñer a corda alí. Estou próximo vai imprimir algo como printf "grazas por% s barra invertida n coma. "E, como sempre, eu son vai pasar na secuencia, s. Agora imos gardar, compilar e executar este programa, e vexa se non podemos inducir o problema que eu prevía. Fai scanf-1. ./scanf-1. Cadea por favor. Imos ofrecer algo así como: "Ola". "Grazas polo nulo." Hmm, iso non é o que eu estaba esperando. Entón o que está pasando aquí? Ben, ao parecer, xa declaramos s como unha estrela de char pero non o fixemos efectivamente almacenados no s a dirección dun peza real de memoria, scanf non ten en calquera lugar para poñer a cadea que o usuario inseriu dentro Efectivamente, se o usuario fose tipo agora en un tempo moito maior que cadea "Ola", por exemplo, varias liñas de texto ou varios parágrafos do texto, é moi posible que poidamos inducir un chamado fallo de segmento. Porque scanf non vai saber que Realmente non teño colocar un enderezo dentro de s. Pola contra, vai ver algún valor en s, algún patrón de bits que pode moi ben ser un valor de lixo, non só por casualidade. E scanf aínda vai tentar escribir a cadea user a este enderezo, mesmo se é un valor de lixo, que podería de feito inducir un accidente. Entón, como é que imos solucionar isto?