elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Security Series.XSS. [Cross Site Scripting]


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] ¿Por que una cadena acepta mas valores que su longitud? (solucionado)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] ¿Por que una cadena acepta mas valores que su longitud? (solucionado)  (Leído 4,213 veces)
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
[C] ¿Por que una cadena acepta mas valores que su longitud? (solucionado)
« en: 15 Abril 2012, 00:34 am »

buenas gente, no acabo de entender por que pasa esto. tengo este codigo:

Código
  1. int main() {
  2.  
  3.  char a[5];
  4.  
  5.  scanf("%s",a);
  6.  printf("Cadena:\n%s\n",a);
  7.  
  8.  return 0;
  9. }

entonces cuando le paso la cadena "123456789abcdef", me la devuelve completa por pantalla, y no se por que no se corta y me da solo "12345" que serian los 5 caracteres que he definido como longitud.

he leido acerca de de cadenas estaticas y dinamicas, pero yo en este caso no estoy usando ningun puntero asi que diria que es estatica... no? estaba empezando a comprender algunas cosas y me he encontrado con este problema de la longitud de la cadena y todo lo que creia comprender se ha esfumado de golpe... xD

gracias a quien me arroje un poco de luz!


« Última modificación: 15 Abril 2012, 04:44 am por xiruko » En línea

david_BS

Desconectado Desconectado

Mensajes: 99



Ver Perfil WWW
Re: [C] ¿Por que una cadena acepta mas valores que su longitud?
« Respuesta #1 en: 15 Abril 2012, 00:51 am »

leé acerca de VLA en la red. por ejemplo en wikipedia busca VLA.

EDIT: pongo el link porque sale otra cosa
http://en.wikipedia.org/wiki/Variable-length_array

el tema es que es una norma de c/c++ para los compiladores que acepten arrays de dimension variable, aunque no se si es standard (me parece que no). Es como que se arregla automáticamente, pero no todos los compiladores lo tienen.

codeblocks me parece que si lo tiene, pero Visual Studio no.


En línea

s00rk

Desconectado Desconectado

Mensajes: 195



Ver Perfil
Re: [C] ¿Por que una cadena acepta mas valores que su longitud?
« Respuesta #2 en: 15 Abril 2012, 01:00 am »

Puedes intentar hacer esta prueba mira, al colocar una variable de char de 5, y luego tienes otra y sobre pasas la anterior de 5 esta como abarcaste mas de lo que tienes aun lo podra escribir, PERO esta podria abarcar espacio de otra y modificar otra variable ejemplo:

Y escribe primero algo que no abarque mas de 5, y veras que lo muestra bien, pero si escribes algo mayor como de 17 caracteres .. abarcara espacio del otro ... eso podria perjudicarte bastante es por eso que Debes saber bien la cantidad de caracteres que ocuparas ...

Código
  1. int main()
  2. {
  3.        char palabra2[3];
  4. char palabra[5];
  5. strcpy(palabra2, "123");
  6. scanf("%s", palabra);
  7. printf("\n%s", palabra);
  8. printf("\n%s", palabra2);
  9.        return 0;
  10. }
  11.  
En línea

david_BS

Desconectado Desconectado

Mensajes: 99



Ver Perfil WWW
Re: [C] ¿Por que una cadena acepta mas valores que su longitud?
« Respuesta #3 en: 15 Abril 2012, 01:13 am »

claro, los 5 que reservaste son de los cuales podés estar seguro que son tuyos, ahora más a lo largo de esos 5 es memoria la cual puede estar siendo usada para otras cosas. Aparte de los compiladores con el mecanismo de VLA, lo que corresponde es usar sólo esa memoria que reservaste osea 5.

Y tratándose de cadenas siempre reserva +1 de memoria para el cero delimitador.

En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: [C] ¿Por que una cadena acepta mas valores que su longitud?
« Respuesta #4 en: 15 Abril 2012, 01:36 am »

vale entonces, si yo marco como longitud por ejemplo 10 caracteres, y le paso una cadena de 50 caracteres, los unicos caracteres que 100% seguro guardara bien serian los 10 primeros no? y nadie me asegura que pueda acceder a los 40 caracteres restantes durante el programa ya que quizas se han sobreescrito o algo asi.

es este el razonamiento?

y respecto a lo del VLA, en el ejemplo que dan en wikipedia:

Código
  1. float read_and_process(int n)
  2. {
  3.    float vals[n];
  4.  
  5.    for (int i = 0; i < n; i++)
  6.        vals[i] = read_val();
  7.    return process(vals, n);
  8. }

definen la longitud de la cadena, aunque esta dependa de n. en el caso que os he comentado, yo le doy una longitud de 5 y en cambio me deja pasarle mas caracteres, asi que no veo que sean cosas iguales. si esto no es asi, por favor explicadme el por que ya que veo que son casos distintos.

gracias a los 2!


EDIT: edito para decir que ya encontre la respuesta. por si a alguien le interesa, no llevar un control sobre la memoria asignada a un programa puede provocar esto:
http://es.wikipedia.org/wiki/Desbordamiento_de_búfer

llevo un rato mirando y para evitar que se sobrepase la longitud de la cadena se podria hacer algo asi:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define MAX 8 /*longitud de la cadena*/
  5.  
  6. int main() {
  7.  
  8.  char *pa;
  9.  
  10.  pa=(char*)malloc(MAX*sizeof(char));
  11.  
  12.  if (pa==0) {
  13.    printf("ERROR - No hay memoria disponible.\n");
  14.  } else {  
  15.    printf("Introduce una cadena de maximo %d caracteres:\n",MAX-1); /*MAX-1 para dejar el caracter de fin de cadena \0*/
  16.    scanf("%s",pa);
  17.  
  18.      if ((int)*(pa+MAX-1)!=0) {
  19. printf("ERROR - Excediste los %d caracteres permitidos.\n",MAX-1);
  20.      } else {
  21. printf("Cadena correcta.\n");
  22.      }
  23.    free(pa);
  24.  }
  25.  return 0;
  26. }
  27.  

gracias de nuevo!
« Última modificación: 15 Abril 2012, 04:33 am por xiruko » En línea

burbu_1

Desconectado Desconectado

Mensajes: 159


hamen gaoz


Ver Perfil
Re: [C] ¿Por que una cadena acepta mas valores que su longitud? (solucionado)
« Respuesta #5 en: 15 Abril 2012, 14:23 pm »

leiste algo sobre la funcion strlen:huh: :huh: :huh:
En línea

xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: [C] ¿Por que una cadena acepta mas valores que su longitud? (solucionado)
« Respuesta #6 en: 15 Abril 2012, 15:26 pm »

pues la verdad es que no... xD

empece antes de ayer con C asi que no tengo mucha idea... aunque gracias por la recomendacion y por la web, a favoritos que va.
En línea

fary


Desconectado Desconectado

Mensajes: 1.062



Ver Perfil WWW
Re: [C] ¿Por que una cadena acepta mas valores que su longitud? (solucionado)
« Respuesta #7 en: 15 Abril 2012, 17:15 pm »

leiste algo sobre la funcion strlen:huh: :huh: :huh:

Y para qeu tendría que leer sobre esa función?  :rolleyes:


Es por lo que dice david_BS, tienes que tener cuidado porque te puede sobreescribir datos esenciales y que tu exe se rompa en ejecución.

saludos.
En línea

Un byte a la izquierda.
david_BS

Desconectado Desconectado

Mensajes: 99



Ver Perfil WWW
Re: [C] ¿Por que una cadena acepta mas valores que su longitud? (solucionado)
« Respuesta #8 en: 19 Abril 2012, 06:06 am »

si el problema es que no se sobrepase la longitud entonces usa cin.getline y pasale la cantidad de caracteres máxima.

sino usá un char* con malloc, osea memoria dinámica


sino usa codeblocks XD que te permite el mecanismo de VLA aunque parece poco profesional eso de declarar un string de 5 y que puedas poner los que quieras  :rolleyes:.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[batch] Funcion :len (devuelve la longitud de una cadena)
Scripting
The Shadow 0 2,582 Último mensaje 18 Febrero 2008, 21:32 pm
por The Shadow
Longitud de una cadena en mssql_fetch_object
PHP
Belem 1 2,492 Último mensaje 19 Abril 2010, 16:42 pm
por MazarD
[Batch] 6 maneras de saber la longitud de una cadena
Scripting
modubat 2 11,506 Último mensaje 31 Enero 2021, 03:56 am
por Tsurematsu
obtener longitud de una cadena sin LEN « 1 2 »
Programación Visual Basic
x64core 11 8,308 Último mensaje 10 Septiembre 2011, 02:24 am
por Psyke1
Calcular longitud de cadena C++ (punteros) « 1 2 »
Programación C/C++
Bob1098 14 20,002 Último mensaje 5 Septiembre 2015, 23:59 pm
por Bob1098
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines