[Powered by Google Translate] [Semana 5] [David J. Malan, Harvard University] [Esta es CS50.] [CS50.TV] [Mujer] Está mintiendo, sobre qué, no lo sé. [El hombre] Entonces, ¿qué sabemos? [La mujer] Eso a las 9:15, Ray Santoya estaba en el cajero automático. [El hombre] Así que la pregunta es, ¿qué estaba haciendo a las 9:16? [Mujer] El rodaje de la 9 mm en algo. Tal vez vio al francotirador. [El hombre] O que estaba trabajando con él. [Hombre] Espera. Vuelve uno. [Hombre] ¿Qué es lo que ves? [♫ ♫ música Suspenso] [Mujer] Traiga su boca arriba. Pantalla completa. [Hombre] su gafas. >> Hay una reflexión. [♫ ♫ música Suspenso] [El hombre] Eso es el equipo de béisbol de Nuevita. Esa es su logotipo. [Mujer] Y él está hablando con quien lleva esa chaqueta. [David Malan] Por lo tanto, este es CS50 de 5 semanas, y hoy nos arruinan un poco de la televisión y de la película para usted. Así que cuando estás viendo un espectáculo como este de aquí, y los policías dicen "¿Puedes limpiar eso?" o "mejorar" no hay mejorar en el mundo real. De hecho, lo que realmente consigue es un poco de algo como esto. He levantado una de las fotos del personal de la página. Este es un programa llamado Photoshop. Esto es 1 de 2 Bowdens, 1 de 3 Bowdens realidad, hoy en día, porque tenemos la Sra. Bowden aquí también, con Rob y Pablo. Pero aquí es Rob en la pantalla, y si nos centramos en ese brillo que siempre ha tenido en sus ojos, lo que en realidad vemos es que lo que ves es lo que obtienes. Esto es "mejorado", por lo que "CSI" tiene un poco mal. Hay un clip, si podemos recoger en "CSI" sólo un poco más. Esta es una frase bonita para pronunciar en adelante si desea sonar técnico con tus amigos cuando, en realidad, está diciendo absolutamente nada. [El hombre] Durante semanas he estado investigando los asesinatos asesinas Cabby con un cierto morbo. [Mujer # 1] Esto es en tiempo real. [Mujer # 2] Voy a crear una interfaz GUI utilizando Visual Basic, a ver si puedo rastrear una dirección IP. [Malan] Así audio fuera de sincronía a un lado, la creación de una interfaz gráfica de usuario con Visual Basic para rastrear una dirección IP es una completa tontería. En estos días no se utiliza Visual Basic, no hay necesidad de una interfaz gráfica de usuario y la dirección IP es un término técnicamente precisa. Así que mantener un ojo hacia fuera para ellos, y uno de mis favoritos: Éste es un poco más arcano, porque lo que necesita saber un idioma diferente. Hay un lenguaje llamado Objective-C, que es un superconjunto de C. Lo que significa que es C más algunas características adicionales, entre ellos programación orientada a objetos. Y este es el lenguaje que Apple ha popularizado para la programación de iOS. Así que aquí hay un clip de un show totalmente diferente, de "Numbers" que si en realidad se mira de cerca en su TiVo y la pausa en el momento justo, verás que lo que estamos viendo no es exactamente lo que se está describiendo. Y voy a tratar de un conector de audio diferente aquí y ver si no podemos mantener la sincronización de audio en este momento. Te doy "Numbers". [Hombre # 1] Se trata de una dirección IPv4 de 32 bits. [Hombre # 2] IP, que es la Internet. >> Private red. Es una red privada de Anita. [Malan] Bueno. Se trata de Objective-C, y es por algún programa para colorear para niños, como usted tal vez puede deducir del nombre de la variable de allí. Así que, entonces, era "Numbers". Así que hoy y esta semana te presentamos un poco del mundo de la ciencia forense y el contexto en los problemas, por lo tanto. Hoy será una lección abreviada porque hay un evento especial en aquí después, así que vamos a echar un vistazo, y se burlan tanto de los estudiantes como para los padres de hoy en día con algunas de las cosas que están en el horizonte. Entre ellos, a partir del lunes, tendrá un poco más de sus compañeros de clase. EDX, Harvard y MIT nueva iniciativa en línea para los cursos abiertos y más, está poniendo en marcha en el campus de Harvard, el lunes. Lo que significa venir lunes usted tendrá que - a partir del último recuento, 86.000 compañeros de clase adicionales van a seguir a lo largo de con charlas CS50 y secciones y tutoriales y boletines de problemas. Y como parte de esto, se convertirán en miembros de la clase inaugural de CS50 y CS50x ahora. Como parte de esto, ahora, darse cuenta de que habrá algunos Upsides también. Para prepararse para esto, por la enorme cantidad de estudiantes, baste decir que a pesar de que contamos con 108 TFS y CAS, no exactamente el mejor estudiante / profesor una vez llegamos a 80.000 estudiantes. Así que no vamos a clasificar problema para muchos juegos de forma manual. Así presentó esta semana en el conjunto de problemas será CS50 Check, que va a ser una utilidad de línea de comandos en el aparato que obtendrá una vez que lo actualice a finales de este fin de semana, y usted será capaz de ejecutar un comando, compruebe 50, en su propio conjunto de procesadores, y obtendrá una retroalimentación en cuanto a si su programa es correcto o incorrecto de acuerdo a las especificaciones de diseño diferentes que nos han proporcionado. Así que más que en la especificación y conjunto de problemas y los compañeros de clase CS50x va a utilizar esto también. Así boletín de problemas 4 tiene que ver con la medicina forense. Y esta pieza se inspiró en algunas cosas de la vida real, por lo que cuando yo estaba en la universidad, me internaron por un tiempo con Oficina de Distrito del Condado de Middlesex del Procurador haciendo el trabajo forense con su principal investigador forense, y lo que esto equivalía a Es decir, creo que mencioné la semana pasada algunos, es la policía estatal de comunicación u otros haría entrar, les dejan las cosas como discos duros y CD y los disquetes y similares, y entonces el objetivo de la oficina forense era determinar si los hubo o no evidencia de algún tipo. Esta fue la Unidad de Investigaciones Especiales, así que era delitos de cuello blanco, era una especie más problemática de los delitos, cualquier cosa que implica algún tipo de medios de comunicación digitales, resulta que no mucha gente escribir un e-mail diciendo: "Yo lo hice". Así que muy a menudo estas búsquedas forenses no se presentó todo lo que mucho fruto; pero a veces la gente iba a escribir dichos correos electrónicos. Así que a veces los esfuerzos se vieron recompensados. Pero para llevar a este conjunto de procesadores forense, vamos a introducir en pset 4 un poco de gráficos. Así que probablemente tomar estas cosas por sentado, JPEG, GIF y los que en estos días, pero si usted realmente piensa de él, una imagen, al igual que la cara de Rob, puede modelarse como una secuencia de puntos o píxeles. Ahora, en el caso de la cara de Rob, hay todo tipo de colores, y empezamos a ver los puntos individuales, otherwide conocidos como píxeles, una vez que empezamos para acercar la imagen Pero si simplificamos el mundo sea un poco, y sólo puedo decir que esto aquí es Rob en blanco y negro, bueno, para representar en blanco y negro que sólo se puede utilizar binario. Y si vamos a utilizar binario, 1 ó 0, podemos expresar esta misma imagen de la cara sonriente de Rob con este patrón de bits: 11000011 representa blanco, blanco, negro, negro, negro, negro, blanco blanco. Y lo que no es un gran salto, entonces, empezar a hablar de fotografías a todo color. Las cosas que usted vería en Facebook o tomar con una cámara digital, pero, ciertamente, cuando se trata de colores, necesita más bits. Y muy común en el mundo de las fotografías es utilizar no 1-bit color, ya que esto sugiere, pero de 24-bit color, en el que realmente obtener millones de colores. Así como en el caso cuando el zoom en el ojo de Rob, que era cualquier número de millones de posibilidades diferentes colores. Así que vamos a introducir en este boletín de problemas 4, así como en el tutorial, que será hoy a las 3:30 en lugar de las habituales a causa de 2:30 conferencia del viernes aquí. Pero el video estará en línea, como es habitual, mañana. También voy a presentar a otro formato de archivo. Así que esto está deliberadamente destinada a parecer intimidante al principio, pero esto es sólo parte de la documentación para una estructura C. Resulta que Microsoft, hace años, ayudó a popularizar este formato, llamado el formato de archivo de mapa de bits, BMP, y esto fue un super-simple, colorido formato de archivos gráficos que se utiliza desde hace bastante tiempo ya veces aún para fondos de pantalla en los escritorios. Si usted piensa de nuevo a Windows XP y las colinas y el cielo azul, que era típicamente un BMP, o la imagen de mapa de bits y mapas de bits Es divertido para nosotros porque tienen un poco más de complejidad. No es tan simple como esta rejilla de 0 y de 1; en cambio, tiene cosas como un encabezado al comienzo de un archivo. En otras palabras, dentro de un archivo. Bmp es un manojo entero de 0 y de 1, pero hay algo adicional 0 y 1 en allí. Y resulta que lo que probablemente ha dado por sentado durante años, formatos de archivo como. doc o. xls o mp3. o mp4., sean cuales sean los formatos de archivo que usted está familiarizado. Pues bien, ¿qué significa ser incluso un formato de archivo? Debido a que al final de la día, todos estos archivos tienen que utilizar sólo 0 y de 1 y tal vez los 0 y los 1 representan a, b, c, a través de ASCII o similar, pero a través del final del día, es sólo 0 y de 1. Así que los humanos sólo de vez en cuando deciden inventar un nuevo formato de archivo donde estandarizar lo que los patrones de bits realmente significan. Y en este caso aquí, amigos los que diseñó el formato de archivo de mapa de bits dijo que en el primer byte en un archivo de mapa de bits, como se indica mediante el desplazamiento 0, no, que va a ser un poco crípticamente llamado bfType variable llamada, que sólo representa el tipo de archivo de mapa de bits, el tipo de archivo de mapa de bits que es esto. Se puede inferir, tal vez, desde la segunda fila que compensar 2, número 2 bytes, tiene un patrón de 0 y 1 que representa qué? El tamaño de algo, y va desde allí. Así que en conjunto el problema 4, usted puede caminar a través de algunas de estas cosas. No vamos a terminar el cuidado de todos ellos, pero note que empieza a ponerse interesante alrededor de la línea o byte 54, rgbtBlue, verde y rojo. Si alguna vez has escuchado la sigla RGB, rojo, verde, azul, esta es una referencia a eso. Porque resulta que usted puede pintar todos los colores del arco iris con una combinación de rojo, azul y verde. Y, de hecho, los padres en la habitación puede recordar algunos de los primeros proyectores. En estos días, usted acaba de ver una luz brillante que sale de una lente. Sin embargo, en su día, tuvo la lente de color rojo, la lente azul y verde de la lente y juntos dirigida a la pantalla y se formó un cuadro de colores. Y muy a menudo las escuelas intermedias y secundarias que tienen esos lentes siempre tan ligeramente ladeado, por lo que eran una especie de ver imágenes dobles o triples, pero esa era la idea. Tenías luz roja, verde y azul que pinta un cuadro. Y ese mismo principio se utiliza en las computadoras. Así que uno de los desafíos, entonces, en el conjunto de problemas 4 van a ser un par de cosas: una es para redimensionar una imagen. Para tomar en un patrón de 0 y de 1, averiguar qué trozos de 0 y de 1 representan lo que en una estructura de este tipo, y luego encontrar la manera de reproducir los píxeles: los rojos, los azules, los verdes dentro, así que cuando una imagen se ve como este principio, podría tener este lugar después de eso. Entre otros desafíos, también, va a ser que se le entregó una imagen forense de un archivo real de una cámara digital y en esa cámara, hace mucho tiempo, eran un montón de fotos. El problema es que nos borren por accidente o ha tenido la imagen dañada de alguna manera. Las cosas malas suceden con cámaras digitales, por lo que rápidamente copiado todos los años 0 y 1 de fuera de esa tarjeta para usted, salvó a todos en un archivo grande, y luego los vamos a entregar a usted problema en el grupo 4 de modo que usted puede escribir un programa en C con el que recuperar todos esos archivos JPEG, idealmente. Y resulta que los archivos JPEG, aunque son algo así como un formato de archivo complejo, son mucho más complejas que esta cara sonriente aquí. Resulta que cada JPEG comienza con los mismos patrones de 0 y de 1. Así que usando un bucle while o un ciclo for o similar, usted puede iterar sobre todos los 0 y los 1 en esta imagen forense y cada vez que ves el patrón especial que está definido en la especificación del conjunto del problema, se puede asumir, 'Oh, esto es, con una probabilidad muy alta, el inicio de un archivo JPEG, 'y en cuanto a encontrar el mismo patrón, un cierto número de bytes o kilobytes o megabytes después, se puede asumir, 'Ooh! He aquí una segunda JPEG, la foto que tomé después de la primera. Permítanme dejar de leer ese archivo en primer lugar, empezar a escribir este nuevo '. Y la salida de su programa conjunto de procesadores por 4 va a haber hasta 50 imágenes JPEG. Y si no son 50 imágenes JPEG, tiene un poco de un bucle. Si usted tiene un número infinito de imágenes JPEG, tiene un bucle infinito. Así que, también, será un caso bastante común. Eso es lo que está en el horizonte. Cuestionario 0, detrás de nosotros. Date cuenta, por mi correo electrónico, que invariablemente hay gente que son a la vez tipo feliz, neutral, y triste alrededor cuestionario tiempo 0. Y por favor acercarse a mí, la TFS cabeza, Zamyla, su propio TF o una de las entidades emisoras de certificados que usted sepa si usted quisiera discutir cómo iban las cosas. Así que para impresionar a los padres aquí en la habitación, lo que es la biblioteca CS50? Buen trabajo. ¿Cuál es la biblioteca CS50? ¿Sí? [Respuestas de los estudiantes, ininteligible] >> Bien, bien. Así que es un conjunto preescrito de código que nosotros, el personal, escribió: que le proporcionamos, para proporcionar algunas funcionalidades comunes. Cosas como conseguirme una cadena ¡ayúdeme a un int, todas las funciones que se enumeran aquí. A partir de ahora, empezamos a tomar realmente estas ruedas de entrenamiento apagado. Así que vamos a empezar a llevar una "cadena" de usted, que, recordemos, era sólo un sinónimo para el tipo de datos real? char *. Así que para los padres, que probablemente fue - eso es bueno, así char * empezaremos a ver en la pantalla con mayor razón ahora que eliminar "cadena" de nuestro vocabulario, al menos cuando se trata de realmente escribir código. Del mismo modo, vamos a dejar de utilizar algunas de estas funciones como mucho, ya que nuestros programas se van a poner más sofisticado en vez de sólo escribir programas que se sientan allí con un mensaje parpadeando, esperando a que el usuario escriba algo pulg Usted recibirá sus entradas de otros lugares. Por ejemplo, usted los reciba de una serie de bits en el disco duro local. En su lugar, voy a conseguir en el futuro de una conexión de red, un sitio web en alguna parte. Así que vamos a pelar esta capa, por primera vez, y levante el aparato CS50 y el archivo llamado CS50.h, que ha sido fuerte incluso durante semanas. Pero vamos a ver realmente lo que hay dentro de esto. Así que la parte superior del archivo en azul es sólo un montón de comentarios, información sobre la garantía y licencia. Esta es una especie de paradigma común en software, ya que una gran cantidad de software en estos días es lo que se llama "código abierto" lo que significa que alguien ha escrito el código y lo hizo libremente disponible, no sólo para ejecutar y utilizar, pero en realidad leer y modificar e integrar en su propio trabajo. Así que eso es lo que usted ha estado utilizando, el software de código abierto, aunque en una forma muy pequeña. Si me desplazo hacia abajo más allá de los comentarios, sin embargo, vamos a empezar a ver algunas cosas más familiares. Así que notar en la parte superior aquí, que el archivo CS50.h incluye una gran cantidad de archivos de cabecera. Ahora, la mayoría de ellos no hemos visto antes, pero es un familiar; cuál de estos hemos visto, aunque brevemente, hasta el momento? Sí, las bibliotecas estándar. Stdlib.h tiene malloc, así que una vez que empezamos a hablar acerca de la asignación de memoria dinámica, que vamos a volver a la semana siguiente, así, que comenzó a incluir ese archivo. Resulta que bool y verdadero y lo falso en realidad no existe en C, per se, a menos que incluya el archivo aquí. Así tenemos, por semanas, ha incluido estándar bool.h de modo que usted puede utilizar la noción de una. bool, verdadero o falso Sin esto, usted tendría que ordenar de fingir y utilizar un int y sólo arbitrariamente asumir que 0 es falso y 1 es verdadera. Ahora bien, si desplácese hacia abajo aún más, aquí es nuestra definición de una cadena. Resulta que, como hemos dicho antes, que cuando esto * es en realidad no importa. Usted puede incluso tener espacio a su alrededor. Nosotros, en este semestre, ha estado promoviendo como esto para dejar claro que la * tiene que ver con el tipo. Pero dese cuenta, al igual que común, si no un poco más común, es ponerlo allí pero funcionalmente es lo mismo. Pero ahora, si leemos más abajo, vamos a echar un vistazo a, digamos, getInt, porque hemos utilizado que, tal vez, antes que nada este semestre. Y aquí está getInt. Esto es lo que? Este es el prototipo. Muy a menudo, hemos puesto prototipos en la parte superior de nuestro. Archivos c, pero también se puede poner en prototipos archivos de cabecera, archivos. h, como esta aquí, así que cuando usted escribe algunas funciones que desea que otras personas puedan usar, que es exactamente el caso de la biblioteca CS50, no sólo poner en práctica sus funciones en algo así como CS50.c, también poner los prototipos no en la parte superior de ese archivo, pero en la parte superior de un archivo de cabecera, luego de que el archivo de cabecera es lo que los amigos y colegas incluyen, con fuerte incluir en su propio código. Así que todo este tiempo que has estado incluyendo todos estos prototipos eficazmente en la parte superior de su archivo, pero a través de este mecanismo incluyen agudo que, esencialmente, copia y pega este archivo en su cuenta. Ahora, aquí hay algo de documentación muy detallada. Hemos prácticamente por sentado que getInt recibe un int, pero resulta que hay algunos casos extremos, ¿no? ¿Qué pasa si el usuario escribe un número que es demasiado grande? Un trillón, que no puede caber dentro de un int? ¿Cuál es el comportamiento esperado? Bueno, lo ideal es predecible. Así que en este caso, si uno lee la letra pequeña, verás que si la línea no se puede leer, esta INT_MAX devoluciones. Nunca hemos hablado de esto, pero en base a su capitalización, lo que es, probablemente? Es una constante, por lo que es una constante especial que probablemente declarado en uno de esos archivos de cabecera que hay más arriba en el archivo, y INT_MAX es probablemente algo como, aproximadamente, 2 millones de dólares. La idea es que, porque tenemos que indicar de alguna manera que algo salió mal, nosotros, sí, tenemos 4 millones de números a nuestra disposición, negativo 2 millones de dólares en hasta 2 millones de dólares, más o menos. Bueno, lo que es común en la programación es que robar uno de esos números. Quizás 0, tal vez 2 millones de dólares, tal vez negativo 2 millones de dólares. Así que pasar uno de sus valores posibles para que pueda comprometerse con el mundo que si algo sale mal, yo me volveré este valor super-grande. Pero usted no desea que el usuario escriba algo críptica como "2, 3, 4 ..." del número realmente grande, donde se generaliza en cambio como una constante. Así que en realidad, si se estaban anal en las últimas semanas, en cualquier momento que llame getInt, usted debe haber estado revisando con una condición if. ¿El tipo de usuario en INT_MAX, o más específicamente, hizo INT_MAX getInt cambio? Porque si lo hiciera, que en realidad quiere decir que no lo escriba, algo salió mal en este caso. Así que esto es lo que se conoce generalmente como un "centinela" de valor, lo cual significa especial. Bueno, pasemos ahora a los archivos. C. El archivo de C ha existido en el aparato durante algún tiempo, y, de hecho, el aparato tiene que precompilado para usted en esa cosa que llamamos "código objeto" pero eso no le importa a usted donde está porque el sistema sabe, en este caso, donde es, el aparato. Pero vayamos ahora a desplazarse hacia abajo getInt, y ver cómo getInt ha estado trabajando todo este tiempo. Así que aquí tenemos comentarios similares de antes. Permítanme hacer un zoom sobre sólo la parte del código, y lo que tenemos para getInt es la siguiente. No se necesita entrada y devuelve un int, mientras que (verdad), así que tenemos un bucle infinito deliberada pero, presumiblemente, vamos a salir de esto de alguna manera, o volver desde este. Así que vamos a ver cómo funciona esto. Bueno, parece que estamos usando GetString en esta línea primero dentro del bucle, 166. Esto ahora es una buena práctica porque bajo qué circunstancias GetString podría regresar esta palabra clave especial NULL,? Si algo sale mal. ¿Qué podría salir mal cuando se llama algo así como GetString? ¿Sí? [Respuesta Estudiantil, ininteligible] >> Si. Así que tal vez malloc falla. En algún lugar debajo de la campana llamando a GetString malloc, que asigna la memoria, que permite el almacenaje informático todos los caracteres que el usuario escribe en el teclado. Y supongamos que el usuario tenía un montón de tiempo libre y escrito más, por ejemplo, de 2 mil millones de caracteres. Más caracteres que el equipo aún tiene RAM. Bueno, GetString tiene que ser capaz de indicar que para que, incluso si se trata de un caso super, super esquina infrecuente. Tiene que ser de alguna manera capaz de manejar esto, GetString y así, si volver atrás y leer su documentación, lo hace, de hecho, devuelva NULL. Ahora bien, si GetString falla al devolver NULL, getInt va a fallar devolviendo INT_MAX, como un centinela. Estos son sólo convenciones humanas. La única manera de saber que este es el caso es mediante la lectura de la documentación. Así que desplazarse hacia abajo para que el int es realmente GotInt. Así que si me desplazo un poco más lejos, en la línea 170 que tiene un comentario sobre estas líneas. Por lo tanto, declaramos, en 172, un int n y aire char, y entonces esta nueva función que algunos de ustedes han tropezado antes, pero sscanf. Esto significa cadena f exploración. En otras palabras, dame una cadena y lo voy a buscar los fragmentos de información de interés. Entonces, ¿qué significa eso? Bueno, supongo que escribir, literalmente, 1 2 3 en el teclado, y luego pulsa enter. ¿Cuál es el tipo de datos de 1 2 3 cuando son devueltos por GetString? Obviamente es una cadena, ¿no? Tengo una cadena, por lo que 1 2 3 es realmente "1 2 3" con el 0 \ al final de la misma. Eso no es un int. Eso no es un número. Parece un número, pero no es en realidad. Entonces, ¿qué getInt tengo que hacer? Se tiene que explorar esa cadena de izquierda a derecha, 1 2 3 \ 0, y de alguna manera convertir a un entero real. Ahora, usted podría encontrar la manera de hacer esto. Si piensas en pset 2, usted probablemente tiene un poco cómodo con César o Vigenére por lo que puede iterar sobre una secuencia, usted puede convertir caracteres a enteros con púa. Eso es un montón de trabajo. ¿Por qué no llamar a una función como sscanf que hace eso para usted? Así sscanf espera un argumento, en este caso llamado línea, que es una cadena. A continuación, especificar, entre comillas, muy similar a printf, ¿qué es lo que se espera ver en esta cadena? Lo que estoy diciendo aquí es que esperamos ver un número decimal y tal vez un personaje. Y vamos a ver por qué este es el caso en un momento. Resulta que esta notación es ahora una reminiscencia de cosas empezamos a hablar de algo más de una semana. ¿Cuál es & N y & c haciendo por nosotros aquí? [Respuestas de los estudiantes, ininteligible] Sí >>. Me está dando la dirección de n y la dirección de c. Ahora, ¿por qué es tan importante? Bueno, ya sabes que con las funciones en C siempre se puede devolver un valor o ningún valor en absoluto. Usted puede devolver un int, cadena, un flotador, char a, lo que sea. O bien, puede volver vacía, sino que sólo puede devolver una cosa al máximo. Pero aquí queremos sscanf para mí volver tal vez un entero, un número decimal, y también a. char, y voy a explicar por qué el char en un momento Así que efectivamente quieren f para volver dos cosas, eso no es posible en C. Así que usted puede evitar que al aprobar en 2 direcciones, porque en cuanto te entregan una función de dos direcciones, lo que puede que la función de hacer con ellos? Se puede escribir en esas direcciones. Usted puede utilizar la operación * e "ir allí" para cada una de esas direcciones. Es una especie de este mecanismo de puerta trasera, pero muy común para cambiar los valores de las variables en más de sólo 1 lugar, en este caso 2. Ahora, noten que estoy comprobando == a 1, y luego regresar n si eso es así, de hecho, se evalúan como true. Entonces, ¿qué está pasando? Bueno, técnicamente, todo lo que realmente queremos que suceda en getInt es esto. Queremos analizar, por decirlo así, queremos leer la cadena "1 2 3", y si parece que hay un número allí, lo que estamos diciendo sscanf que hacer es poner ese número, 1 2 3, en esta variable n para mí. ¿Por qué, entonces, tengo esto así? ¿Cuál es el papel de la también diciendo: sscanf, también puede ser que consiga un personaje aquí. [Habla el estudiante, ininteligible] >> No - un punto decimal podía trabajar. Vamos a celebrar que pensó por un momento. ¿Qué más? [Estudiante, ininteligible] >> Así que, buen pensamiento, podría ser el carácter NULL. En realidad no es, en este caso. ¿Sí? [Estudiante, ininteligible] >> ASCII. O bien, permítanme generalizar aún más. El% c no es sólo para la comprobación de errores. No queremos que haya personaje después del número, pero lo que esto me permite hacer es lo siguiente: Resulta que sscanf, además de almacenar los valores de N y C, en este ejemplo aquí, lo que también hace es que devuelve el número de variables que poner los valores cm Así que si sólo escribes 1 2 3, entonces sólo el% d va a coincidir y sólo se almacena n con un valor como 1 2 3 y nada se pone en c; c sigue siendo un valor basura, por así decirlo. Basura, ya que nunca se ha inicializado como un valor. Así que en ese caso, sscanf devuelve 1, porque poblada uno de los punteros, en cuyo caso, genial. Tengo un int, por lo que liberar la línea para liberar la memoria GetString que realmente asignado, y luego vuelvo n. Si no, si te has preguntado donde reintento declaración que viene, viene de aquí. Si, por el contrario, de tipo I en 1 2 3 foo, sólo alguna secuencia aleatoria de texto, sscanf va a ver, ooh, número, ooh, número, ooh, número, ooh - f. Y se va a poner la 1 2 3 n. Se va a poner la f en c, y luego volver 2. Así que tenemos, simplemente usando la definición básica de la conducta de scanf, una manera muy sencilla - bien, complejo a primera vista, pero al final de la día, mecanismo bastante simple de decir, ¿hay un int, y si lo es, que lo único que he encontrado? Y el espacio en blanco aquí es deliberada. Si usted lee la documentación de sscanf, ella le dice que si se incluye un pedazo de espacio en blanco al principio o al final, sscanf también permitirá al usuario, por cualquier razón, para golpear la barra espaciadora 1 2 3, y que será legítimo. No gritará en el usuario sólo porque pulsar la barra espaciadora al principio o al final, que es sólo un poco más fácil de usar. Cualquier pregunta, entonces, en GetInts? ¿Sí? [Pregunta Estudiante, ininteligible] >> Buena pregunta. ¿Qué pasa si usted acaba de escribir en un char, como f, y pulsa enter sin tener que teclear 1 2 3; ¿qué te parece el comportamiento de esta línea de código sería entonces? Así sscanf que puede cubrir también, porque en ese caso, que no va a llenar n oc, sino que va a volver en vez 0. En este caso, también estoy captura de ese escenario, ya que el valor esperado que quiero es 1. Sólo quiero una, y sólo una cosa para ser llenados. Buena pregunta. ¿Otros? Muy bien, así que no vamos a ir a través de todas las funciones de aquí, pero la que parece ser, tal vez, del interés restante se GetString porque resulta que GetFloat, getInt, GetDouble GetLongLong todo punt gran parte de su funcionalidad a GetString. Así que echemos un vistazo a la forma en que se lleva a cabo aquí. Éste parece un poco complejo pero utiliza los mismos fundamentos que empezamos a hablar de la semana pasada. Así que en GetString, que no tiene en argumento como por el vacío hasta aquí, y devuelve una cadena, por lo que estoy declarando una cadena denominada buffer. Realmente no sé lo que va a ser utilizado para todavía, pero ya veremos. Looks like capacidad es, por defecto, 0; sin saber muy bien a dónde va esto. No estoy seguro que n va a ser utilizado para todavía. Pero ahora se está volviendo un poco más interesante, por lo que en la línea 243, declaramos un int c, esto es una especie de un detalle tonto. Un char es de 8 bits, y 8 bits puede almacenar cuántos valores diferentes? 256. El problema es que si usted quiere tener 256 caracteres ASCII diferentes, que hay, si usted piensa de nuevo, y esto no es algo para memorizar. Pero si piensas en esa tabla ASCII grande que tuvimos semanas atrás, hubo, en ese caso, 128 o 256 caracteres ASCII. Utilizamos todos los patrones de 0 y 1 que pasa. Eso es un problema si usted quiere ser capaz de detectar un error. Porque si usted ya está usando 256 valores para sus personajes, que en realidad no planificar el futuro, porque ahora no hay manera de decir: "Esto no es un personaje de fiar, lo que es cierto mensaje erróneo". Entonces, ¿qué hace el mundo es, utilizar el valor más cercano; algo así como un int para que tenga un número loco de bits, 32 por 4 billones de valores posibles, por lo que sólo tiene que terminan usando, esencialmente, 257 de ellos, 1 de los cuales tiene un significado especial como un error. Así que vamos a ver cómo funciona esto. En la línea 246, tengo este gran bucle while que está llamando fgetc, archivo f significado, getc, a continuación, stdin. Resulta que esta es sólo la forma más precisa de decir "leer la entrada desde el teclado." Teclado estándar medio de entrada, la salida estándar significa pantalla, y el error estándar, que veremos en pset 4, significa que la pantalla, pero una parte especial de la pantalla de modo que no está fusionado con una producción real que se pretende imprimir, pero más sobre esto en el futuro. Así fgetc sólo significa leer un carácter del teclado y almacenarlo donde? Guárdelo en c, y luego comprobar, así que estoy usando algunas conjunciones booleanos aquí, comprobar que no es igual a \ n, por lo que el usuario ha llegado a entrar. Queremos dejar en ese punto, al final del bucle, y también queremos comprobar para la constante especial, EOF, lo que si sabe o adivina - ¿qué significa? Final del archivo. Así que esto es algo sin sentido, porque si estoy escribiendo en el teclado, no hay realmente ningún archivo involucrados en esto, pero esto es sólo una especie del término genérico utilizado para referirse que nada más viene de los dedos del humano. EOF. Final del archivo. Como acotación al margen, si alguna vez te has golpeado el control d en el teclado, No es que usted tendría todavía, usted ha golpeado control c. Pero el control d envía este especial EOF constante llamada. Así que ahora sólo nos queda un poco de asignación de memoria dinámica. Así que si n + 1> la capacidad, ahora voy a explicar n. n es simplemente cuántos bytes se encuentran actualmente en el búfer, la cadena que se está construyendo en la actualidad por parte del usuario. Si usted tiene más personajes en el búfer de lo que tiene la capacidad de la memoria intermedia, intuitivamente, lo que tenemos que hacer entonces es asignar más capacidad. Voy a pasar rozando algunas de las operaciones aritméticas aquí y centrarse sólo en esta función aquí. ¿Sabes lo que malloc es, o por lo menos familiarizados general. Adivina lo que realloc hace. [Respuesta Estudiantil, ininteligible] Sí >>. Y no es bastante la adición de memoria, sino que reasigna la memoria de la siguiente manera: Si todavía hay espacio en el extremo de la cuerda para que dure más de que la memoria de lo que originalmente le da, entonces usted conseguirá que la memoria adicional. Así que usted puede poner las cadenas de caracteres espalda con espalda a espalda con espalda. Pero si ese no es el caso, ya que esperó demasiado tiempo y tiene algo aleatorio se dejó caer en memoria allí, pero no es extra memoria aquí, eso está bien. Realloc va a hacer todo el trabajo pesado para usted, mover la cadena ha leído hasta ahora de aquí, lo dejó allí, y luego le dan la pista un poco más en ese punto. Así que con un gesto de la mano, déjame decir que lo que está haciendo GetString se está comenzando con un buffer pequeño, tal vez un solo carácter, y si el usuario escribe en 2 caracteres, GetString termina llamando realloc y dice: "Oh, un personaje no era suficiente. Dame 2 caracteres. Entonces, si usted lee a través de la lógica del bucle, que va a decir, 'Oh, el usuario escribió en 3 caracteres. Dame ahora no 2, sino 4 caracteres, entonces dame 8, entonces dame 16 y 32. El hecho de que estoy doblando la capacidad cada vez significa que el buffer no va a crecer lentamente. Va a crecer muy rápido, y lo que podría ser la ventaja de eso? ¿Por qué estoy doblando el tamaño de la memoria intermedia, aunque el usuario sólo puede ser que necesite un personaje extra del teclado? [Estudiante respuesta ininteligible]. >> ¿Qué es eso? Exactamente. Usted no tiene que crecer con tanta frecuencia. Y esto es sólo una especie de - usted está de cobertura sus apuestas aquí. La idea es que usted no desea llamar realloc mucho, ya que tiende a ser lenta. Cada vez que usted le pide al sistema operativo para la memoria, como pronto veremos en un conjunto de problemas en el futuro, se tiende a tomar algún tiempo. Así que minimiza la cantidad de tiempo, incluso si usted está perdiendo un poco de espacio, tiende a ser una buena cosa. Pero si leemos a través de la parte final del GetString aquí, y de nuevo, la comprensión de cada línea aquí no es tan importante hoy en día. Pero nótese que finalmente llama a malloc nuevo, y la asigna a lo exactamente tantos bytes como necesita para la cadena y luego tira a la basura llamando libre, el búfer excesivamente grande, si de hecho he doblado varias veces. En fin, así es como GetString ha estado trabajando todo este tiempo. Todo lo que hace es leer un caracter a la vez una y otra vez y otra vez y cada vez que necesita algo de memoria adicional, le pide al sistema operativo para que al llamar realloc. ¿Alguna pregunta? Está bien. Un ataque. Ahora que entendemos los punteros, o por lo menos están cada vez más familiarizados con los punteros, vamos a considerar cómo el mundo entero comienza a derrumbarse si no alcanzas a defender contra los usuarios contradictorio, personas que están tratando de cortar en su sistema. Las personas que están tratando de robar su software eludiendo un código de registro que de lo contrario podría tener que escribir pulg Echa un vistazo a este ejemplo aquí, que es sólo el código C que tiene una función principal en la parte inferior, que llama a una función foo, y ¿qué es lo que pasa a foo? [Estudiante] Un solo argumento. Soltero >> argumento. Así que argv [1], lo que significa la primera palabra que el usuario escribió en la línea de comando después de a.out o lo que se denomina el programa. Así foo, en la parte superior, lleva en un char *, char *, pero es lo que? String. No hay nada nuevo aquí, y esa cadena es arbitrariamente ser llamado bar. En esta línea aquí, char c [12], en una especie de semi-Inglés técnico, lo que está haciendo esta línea? Matriz de -? Personajes. Dame una matriz de 12 caracteres. Así que podríamos llamar esto un buffer. Se denomina técnicamente c, pero en un tampón de programación sólo significa un montón de espacio que usted puede poner algunas cosas pulg A continuación, por último, memcpy, no hemos usado antes. Pero que es fácil adivinar lo que hace. Copia de la memoria. ¿Qué hacer? Bueno, al parecer copia bar, su entrada, en c, pero sólo hasta la longitud de la barra. Pero hay un error aquí. Bueno, por lo que técnicamente debería hacer strlen (bar) x sizeof (char), eso es correcto. Pero en el peor de los casos aquí, vamos a suponer que eso es - así, está bien. Entonces hay dos errores. Así sizeof (char), está bien, vamos a hacer esto un poco más. Así que ahora que todavía hay un error, que es lo que? [Respuesta Estudiantil, ininteligible] >> ver para qué? Bueno, por lo que debe comprobar NULL, porque las cosas malas suceden cuando el puntero es NULL, Debido a que usted puede ser que termine encima de ir allí, y no siempre se va a NULL por eliminación de referencias con el operador *. Así que eso es bueno, ¿y qué más vamos a hacer? Lógicamente hay un error aquí. [Respuesta Estudiantil, ininteligible] A fin de comprobar si >> argc ≥ 2? Bueno, por lo que hay tres errores en este programa. No estamos comprobando si el usuario realmente escribió en nada en argv [1], bueno. ¿Cuál es el error tercera? ¿Sí? [Respuesta Estudiantil, ininteligible] >> Bien. Así que nos registramos un escenario. Hemos comprobado implícitamente no copiar más memoria que se exceda la longitud de la barra. Así que si la cadena que el usuario escribió en es de 10 caracteres de longitud, esto nos dice: "Sólo copiar 10 caracteres. Y eso está bien, pero ¿qué pasa si el usuario escribió en una palabra en el indicador como una palabra de 20 caracteres, lo que es, diciendo copia 20 caracteres de barra en qué? c, también conocido como nuestro buffer, lo que significa que acabas de escribir datos a 8 lugares byte que usted no es dueño, y no los poseen en el sentido de que nunca se les asignan. Así que esto es lo que se conoce generalmente como el ataque de desbordamiento de búfer, o buffer overrun ataque y ataque, en el sentido de que si el usuario o el programa que está llamando a su función está haciendo esto con malicia, lo que realmente sucede a continuación podría ser muy malo. Vamos a echar un vistazo a esta foto aquí. Este cuadro representa la pila de memoria. Y recordar que cada vez que se llama a una función, recibe este pequeño marco en la pila y luego otra y luego otra y luego otra. Y hasta ahora hemos sólo un poco abstraído estas lejos como rectángulos o bien hay en la pizarra o en la pantalla aquí. Pero si nos centramos en uno de esos rectángulos, cuando se llama a una función foo, resulta que hay más en la pila dentro de ese marco y rectángulo que que apenas x e y y a y b, como lo hicimos hablando de swap. Resulta que hay algunos detalles de nivel inferior, entre ellos la dirección de retorno. Así que resulta cuando principal llama foo, el principal tiene que informar foo cuál es la dirección principal está en la memoria de la computadora. Porque de lo contrario, tan pronto como foo se hace ejecutar, como en este caso aquí, una vez que llegue a este corchete cerca al final de foo, cómo diablos se sabe foo donde el control del programa se supone que debe ir? Resulta que la respuesta a esa pregunta es en ese rectángulo rojo aquí. Esto representa un puntero, y le toca a la computadora para almacenar, temporalmente, en la pila de llamada de la dirección principal, de modo que tan pronto como foo se hace ejecutar, el equipo sabe dónde y qué línea principal para volver. Guardado puntero marco relaciona de manera similar a esto. Bar Char * aquí representa qué? Bueno, ahora este segmento azul aquí es foo marco, ¿cuál es bar? Bueno, por lo bar es sólo el argumento de la función foo. Así que ahora estamos de vuelta en el cuadro familiar. Hay más cosas y más distracciones en la pantalla pero este segmento de color azul claro es lo que hemos estado dibujando en la pizarra para algo como swap. Ese es el marco para foo y lo único en que en este momento es bar, que es este parámetro. Pero lo que más debería estar en la pila, de acuerdo con este código aquí? Char c [12]. Así que también debemos ver 12 cuadros de la memoria, asignado a una variable llamada c. Y, de hecho tenemos que en la pantalla. La parte superior hay c [0], y entonces el autor de este diagrama no se molestó en dibujar todas las plazas pero en realidad hay 12 hay porque si nos fijamos en la parte inferior derecha, c [11], si contamos desde 0, es de 12 bytes mismas. Pero aquí está el problema: ¿En qué dirección se c creciendo? Ordenar de arriba hacia abajo, ¿no? Si se inicia en la parte superior y crece hacia el fondo, no parece que nos dejó la pista mucho aquí en absoluto. Hemos clase de nosotros mismos pintado en una esquina, y que c [11] es justo contra bar, que está justo en contra puntero del marco de pila, que es justo en contra la dirección del remitente, hay espacio más. Entonces, ¿cuál es la implicación, entonces, si metes la pata, y se intenta leer 20 bytes en un búfer de 12 bytes? ¿Dónde están esos 8 bytes adicionales va a ir? Dentro de todo lo demás, algunos de los cuales es súper importante. Y lo más importante, potencialmente, es el cuadro rojo ahí, la dirección del remitente. Porque supongo que usted es ya sea accidental o de contradicción sobrescribir esos 4 bytes, que se ocupan de puntero, no sólo con la basura, pero con un número que pasa a representar una dirección real en la memoria? ¿Cuál es la implicaiton, lógicamente? [Respuestas de los estudiantes, ininteligible] >> Exactamente. Cuando regresa foo y éxitos que corchete, el programa se va a proceder para no volver al menú principal, que va a volver a lo que la dirección está en esa caja roja. Ahora bien, en el caso del registro de software eludir, ¿cuál es la dirección que está siendo devuelto a la función se que normalmente se llama después de haber pagado por el software y los introduce tu código de registro? Usted puede ordenar truco de la computadora en no ir aquí, pero en su lugar, ir aquí. O, si eres realmente inteligente, un adversario realmente puede escribir en el teclado, por ejemplo, no es una palabra real, los personajes no 20, pero supongo que él o ella en algunos tipos de caracteres que representan el código? Y no va a ser el código C, que va a ser los personajes que representan los códigos binarios de máquinas, 0 y 1. Pero supongamos que eres lo suficientemente inteligente como para hacer eso, para pegar de alguna manera en el símbolo del sistema GetString algo que es esencialmente el código compilado, y los últimos 4 bytes que sobrescribir la dirección del remitente, y qué dirección lo hace de entrada? Se almacena en este rectángulo rojo la dirección del primer byte de la memoria intermedia. Así que hay que ser muy inteligente, y esto es un montón de prueba y error para la gente mala por ahí, pero, si se puede saber qué tan grande es este tampón de manera que los últimos bytes de la entrada que se proporcionan con el programa pasar a ser equivalente a la dirección de inicio de la memoria intermedia, usted puede hacer esto. Si decimos, por lo general, hola, y \ 0, eso es lo que termina en el búfer. Pero si eres más inteligente, y llenar el buffer con lo que genéricamente llamaremos código de ataque, A, A, A, A: Atacar, atacar, atacar y atacar, cuando esto es algo que hace algo malo. Bueno, ¿qué pasa si eres realmente inteligente, puede hacer lo siguiente: En el cuadro rojo aquí es una secuencia de números: 80, CO, 35, 08. Tenga en cuenta que que coincide con el número que está aquí arriba. Está en orden inverso, pero más de eso en otro momento. Tenga en cuenta que esta dirección de retorno se hayan modificado para igualar la dirección de aquí, no la dirección de la principal. Así que si el malo de la película es súper inteligente, él o ella va a incluir en ese código de ataque algo así como, 'Eliminar todos los archivos del usuario. O 'Copiar las contraseñas ", o" Crear una cuenta de usuario que puede iniciar sesión en. Nada en absoluto, y esto es a la vez el peligro y el poder de la C. Debido a que tiene acceso a la memoria a través de punteros y por lo tanto se puede escribir lo que quiera en la memoria de una computadora. Usted puede hacer que un equipo hacer lo que quieras con sólo haberlo saltar dentro de su propio espacio de memoria. Y así, hasta la fecha, por lo que muchos programas y sitios web internacionales de tantos que están comprometidos se reducen a las personas que toman ventaja de esto. Y esto puede parecer un ataque super-sofisticada, pero no siempre comienza de esa manera. La realidad es que lo que la gente mala suele hacer es, si se trata de un programa en una línea de comandos o un programa de interfaz gráfica de usuario o una página web, Se acaba de empezar a proporcionar una tontería. Usted escribe en una palabra muy grande en el campo de búsqueda y pulsa enter, y esperar a ver si se bloquea el sitio web. O esperar a ver si el programa se manifiesta algún mensaje de error. Porque si tienes suerte, ya que el malo de la película, y proporcionar alguna entrada loco que bloquea el programa, eso significa que el programador no previó su mal comportamiento lo que significa que probablemente pueda, con el suficiente esfuerzo, suficiente juicio y error, encontrar la manera de librar un ataque más preciso. Así que una parte tan importante de la seguridad no es sólo evitar estos ataques por completo, pero su detección y en realidad mirando logs y ver lo que la gente loca entradas tecleadas en su sitio web. ¿Qué términos de búsqueda y la gente escribe en su página web con la esperanza de algún desbordamiento buffer? Y todo esto se reduce a lo básico sencillas de lo que es una matriz, y ¿qué significa para asignar y utilizar la memoria? Y relacionado con eso, también, es la siguiente. Así que vamos a echar un vistazo en el interior de un disco duro nuevo. Por lo que recuerdo de una o dos semanas atrás, que al arrastrar archivos a la papelera de reciclaje o bote de basura, ¿qué pasa? [Estudiante] Nada. >> Sí, absolutamente nada. Finalmente, si se ejecuta bajo espacio en disco, Windows o Mac OS comenzará a eliminar archivos por usted. Pero si arrastra algo allí, entonces no es en absoluto seguro. Todo miembro de su compañero de cuarto, un amigo o familiar tiene que hacer es doble clic, y listo. No todos los archivos incompletos que trataron de borrar. Así que la mayoría de nosotros por lo menos saber que usted tiene que hacer clic derecho o control clic y vaciar la basura, o algo por el estilo. Pero incluso entonces, que no acaba de hacer el truco. Porque lo que sucede cuando se tiene un archivo en el disco duro que representa algún procesador de texto o JPEG poco? Y esto representa el disco duro, y digamos que esta astilla aquí representa ese archivo, y se compone de un montón de 0 y 1. ¿Qué sucede cuando usted no sólo arrastrar el archivo a la papelera o papelera de reciclaje, pero también vaciarlo? Una especie de nada. No hay absolutamente nada ahora. Ahora es simplemente nada, porque un poco de algo que ocurre en la forma de esta mesa. Así que hay una especie de base de datos o tabla dentro de la memoria de una computadora que esencialmente tiene 1 columna para los nombres de archivos, y una columna para la ubicación del archivo, donde esto podría ser la ubicación 123, un número al azar. Así que podríamos tener algo como x.jpg y la ubicación 123. ¿Y qué pasa entonces, al vaciar la papelera? Que se vayan. Pero lo que no desaparece es del 0 y el 1. Entonces, ¿qué es, entonces, la conexión al conjunto de procesadores 4? Bueno, con el conjunto de procesadores 4, sólo porque hemos borrado accidentalmente la tarjeta flash compacta que tenía todas estas fotos, o simplemente porque la mala suerte se corrompió, no quiere decir que el 0 y el de 1 no están todavía allí. Tal vez algunos de ellos se han perdido porque algo se corrompe en el sentido de que algunos de 0 convirtió en 1 y la de 1 se convirtió en 0. Las cosas malas pueden suceder a causa de software defectuoso o hardware defectuoso. Pero muchos de esos bits, tal vez incluso el 100% de ellos todavía están allí, lo que pasa es que el ordenador o la cámara no sabe dónde comenzó JPEG 1 y donde JPEG 2 comenzó, pero si usted, el programador, sabes, con un poco de sentido común, donde los archivos JPEG o lo que parecen, usted puede analizar los 0 y los 1 y decir, 'Ooh. JPEG. Ooh, JPEG. Usted puede escribir un programa con esencialmente un bucle for o while que recupera todos y cada uno de esos archivos. Así que la lección entonces, es comenzar "segura" borrando sus archivos si quieres evitar esto por completo. ¿Sí? [Pregunta Estudiante, ininteligible] >> Tener más memoria que antes - Oh! Buena pregunta. ¿Por qué, entonces, después de vaciar la basura, El ordenador le dirá que usted tiene más espacio libre que antes? En pocas palabras, porque está mintiendo. Más técnicamente, usted tiene más espacio. Porque ahora que has dicho, puedes poner otras cosas en ese archivo una vez fue, pero eso no significa que los bits van a desaparecer, y eso no significa que los bits se están cambiando todos los 0, por ejemplo, para su protección. Por el contrario, si "segura" borrar archivos, o destruir físicamente el dispositivo, que realmente es la única manera, a veces, alrededor de eso. Así que ¿por qué no nos vamos en esa nota semi-miedo, y nos vemos el lunes. CS50.TV