Herramientas de usuario

Herramientas del sitio


strings

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
strings [2012/08/16 00:45] – [Strings] lmateustrings [2015/03/31 12:50] (actual) – [Leer de la entrada estándar] lmateu
Línea 13: Línea 13:
 Tanto r como s representan el mismo string.  El diagrama es el siguiente: Tanto r como s representan el mismo string.  El diagrama es el siguiente:
  
-{{ :strings.png?nolink&400 |}}+{{ :strings2.png?nolink&400 |}}
  
 La única diferencia es que el string "hola" queda almacenado en un área del proceso que no permite escribirla. La única diferencia es que el string "hola" queda almacenado en un área del proceso que no permite escribirla.
Línea 28: Línea 28:
 ^ Nombre ^ Ejemplo ^ Descripción ^ ^ Nombre ^ Ejemplo ^ Descripción ^
 | strlen | int l= strlen("hola"); | calcula el largo de un string | | strlen | int l= strlen("hola"); | calcula el largo de un string |
 +| strcmp | strcmp(fuente, "hola"); | compara 2 strings entregando < 0, 0 o > 0 |
 +| strncmp | strncmp(fuente, "hola", n); | compara hasta n caracteres |
 | strcpy | strcpy(dest, fuente); | copia el string fuente en dest | | strcpy | strcpy(dest, fuente); | copia el string fuente en dest |
 | strncpy | strncpy(dest, fuente, n); | copia a lo más n caracteres de fuente en dest | | strncpy | strncpy(dest, fuente, n); | copia a lo más n caracteres de fuente en dest |
 | strcat | strcat(dest, fuente); | agrega el string fuente al string dest | | strcat | strcat(dest, fuente); | agrega el string fuente al string dest |
  
 +  * La función strcmp entrega < 0 si el primer argumento es lexicográficamente menor que el segundo, 0 si son iguales y > 0 si es mayor.
 +  * La función strncmp es similar solo que compara hasta n caracteres.
   * Antes de invocar strcpy y strcat se debe reservar suficiente memoria en dest para almacenar el resultado.   * Antes de invocar strcpy y strcat se debe reservar suficiente memoria en dest para almacenar el resultado.
   * En el caso de strncpy, se debe reservar exactamente n caracteres.  Si ''strlen(fuente)>=n'' entonces dest no termina en 0.   * En el caso de strncpy, se debe reservar exactamente n caracteres.  Si ''strlen(fuente)>=n'' entonces dest no termina en 0.
Línea 53: Línea 57:
  
 char *strcpy(char *d, char *s) { char *strcpy(char *d, char *s) {
-  char *t= s;+  char *t= d;
   while (*t++ = *s++)   while (*t++ = *s++)
     ;     ;
Línea 59: Línea 63:
 } }
 </code> </code>
 +
 +=== Ejercicio 1 ===
 +
 +Resuelva la pregunta 1 del [[http://users.dcc.uchile.cl/~lmateu/CC3301/controles/c1-141.pdf|control 1 del semestre Otoño de 2014]].  Pruebe su solución con el archivo [[http://users.dcc.uchile.cl/~lmateu/CC3301/download/subst.zip|subst.zip]].  Implemente su solución en el archivo substituir.c.  Compílelo con make y ejecútelo.  El programa le dirá si su solución satisface todos los tests del enunciado.
  
 ==== Desplegar texto en la salida estándar ==== ==== Desplegar texto en la salida estándar ====
Línea 83: Línea 91:
 ^ función ^ ejemplo ^ descripción ^ ^ función ^ ejemplo ^ descripción ^
 | fprintf(//file//, //formato//, ...) | ''fprintf(stderr, "error %d\n", errno());'' | envía al archivo //file// | | fprintf(//file//, //formato//, ...) | ''fprintf(stderr, "error %d\n", errno());'' | envía al archivo //file// |
-| sprintf(//string//, //formato//, ...) | ''fprintf(t, "%d\n", i);'' | escribe en un string |+| sprintf(//string//, //formato//, ...) | ''char t[80]; sprintf(t, "%d\n", i);''    | escribe en el string |
  
   * La variable stderr corresponde a la salida estándar de errores.  stdin corresponde a la entrada estándar y stdout a la salida estándar.   * La variable stderr corresponde a la salida estándar de errores.  stdin corresponde a la entrada estándar y stdout a la salida estándar.
Línea 146: Línea 154:
   * argv[0] siempre corresponde al nombre del ejecutable.   * argv[0] siempre corresponde al nombre del ejecutable.
  
 +=== Ejercicio 2 ===
 +
 +Programe la función que lleva un string a letras mayúsculas.  Por ejemplo:
 +
 +<code>
 +int main() {
 +  char str[80];
 +  strcpy(str, "el numero pi es 3.14");
 +  mayusculas(str);
 +  printf("%s\n", str); /* despliega EL NUMERO PI es 3.14 */
 +  return 0;
 +}
 +</code>
 ==== Leer de la entrada estándar ==== ==== Leer de la entrada estándar ====
  
Línea 152: Línea 173:
 ^ función ^ ejemplo ^ descripción ^ ^ función ^ ejemplo ^ descripción ^
 | getchar() | ''char c= getchar();'' | Lee un caracter | | getchar() | ''char c= getchar();'' | Lee un caracter |
-| gets(//dest//) | ''fgets(t, 80);'' | Lee una línea terminada en '\n' |+| gets(//dest//) | ''gets(t);'' | Lee una línea terminada en '\n' |
 | fgets(//dest//, //max//, //file//) | ''fgets(t, 80, stdin);'' | Lee una línea terminada en '\n' de //file// | | fgets(//dest//, //max//, //file//) | ''fgets(t, 80, stdin);'' | Lee una línea terminada en '\n' de //file// |
 | scanf(//formato//, //arg1//, ...)  | ''fscanf("%d", &i);'' | Lee datos de la entrada estándar | | scanf(//formato//, //arg1//, ...)  | ''fscanf("%d", &i);'' | Lee datos de la entrada estándar |
  
-=== Ejercicio ===+**Observación**: ''gets'' no recibe como parámetro el tamaño del arreglo de caracteres en donde se deja el resultado 
 +y por lo tanto no se debe usar para leer datos de la red o de un archivo de origen desconocido porque puede 
 +ser blanco de ataques de gusanos o virus.  Consulte en la web por //buffer overflow attack// En su lugar use ''fgets''
 + 
 +=== Ejercicio ===
  
 El siguiente programa despliega la línea más larga de la entrada estándar: El siguiente programa despliega la línea más larga de la entrada estándar:
Línea 169: Línea 194:
   int largo= 0;   int largo= 0;
  
-  while (gets(lin)!=NULL) {+  /* nunca while (gets(lin)!=NULL) pues sería una brecha de seguridad */ 
 +  while (fgets(lin, N, stdin)!=NULL) {
     if (strlen(lin)>largo) {     if (strlen(lin)>largo) {
       strcpy(larga, lin);       strcpy(larga, lin);
strings.1345077938.txt.gz · Última modificación: 2012/08/16 00:45 por lmateu