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

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  (Consulta) [C] ¿Usar los corchetes para delimitar caracteres es ANSI?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: (Consulta) [C] ¿Usar los corchetes para delimitar caracteres es ANSI?  (Leído 4,963 veces)
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
(Consulta) [C] ¿Usar los corchetes para delimitar caracteres es ANSI?
« en: 15 Junio 2016, 08:39 am »

Hola, muy buenas. Quería preguntar en base al siguiente código:

Código
  1. #include <stdio.h>
  2.  
  3. int main() {
  4. char cadena[16];
  5.  
  6. fscanf(stdin, "%s[^16]", cadena);
  7. fprintf(stdout, cadena);
  8.  
  9. return 0;
  10. }

En este código, uso %s[^16] para delimitar los caracteres que puede tener la cadena, pero al probar este código y probando con cadenas mayores a 16 caracteres, el programa me daba error de segmentation fault (me lo ha dicho el debugger del MinGW-w64). Esto me lleva a la siguiente pregunta: ¿usar esta manera para delimitar los caracteres es ANSI, o solo está disponible para solo ciertos compiladores?

Gracias :D


En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: (Consulta) [C] ¿Usar los corchetes para delimitar caracteres es ANSI?
« Respuesta #1 en: 15 Junio 2016, 13:56 pm »

Hola te soy sincero no habia visto antes esa forma de limitar la cantidad leida en fscanf...

Por ejemplo esta para delimitar la salida de fprintf con "%.8X" cantidad de hexadecimales a imprimir.

Busque referencias al respecto mientras resolvíamos el otro Topic. De hecho estaba asi:



Tendras alguna fuente donde hablen del formato que en la vaga busqueda que hice no encontre nada.

Saludos


Edito he vuelto a buscar y encontre

http://stackoverflow.com/questions/1247989/how-do-you-allow-spaces-to-be-entered-using-scanf

Donde reiteran el uso de fgets y aun no veo nada de ese formato de cadena

Saludos


« Última modificación: 15 Junio 2016, 15:04 pm por AlbertoBSD » En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Consulta) [C] ¿Usar los corchetes para delimitar caracteres es ANSI?
« Respuesta #2 en: 15 Junio 2016, 15:02 pm »

Ehmmm tampoco hacía falta excederse xD. Gracias por la info. Cambiaré de fuente :P Estoy aprendiendo C y no puedo saber qué es verídico y que no.
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: (Consulta) [C] ¿Usar los corchetes para delimitar caracteres es ANSI?
« Respuesta #3 en: 16 Junio 2016, 20:08 pm »

Para limitar el número de caracteres se usa un entero, que representa el número máximo de caracteres a recoger, entre % y s.

Código
  1. scanf("%5s", cadena);

La técnica de los corchetes es para asegurarse que la cadena solo recoge esos caracteres.

Código
  1. scanf("%[abc]", cadena);

Leerá caracteres hasta que encuentre uno que no sea a, b, o c; en ese momento se detendrá sin recoger ese valor no válido. Cuidado: la cadena a recoger debe empezar al menos, con uno de esos caracteres, sino no está definido su comportamiento.

De igual forma se puede hacer que scanf vaya recogiendo caracteres hasta encontrarse uno de los caracteres de la lista.

Código
  1. scanf("%[^abc]", cadena);

Así, mientras va leyendo encuentra a, b o c, se va a detener sin recoger ese carácter.

Es sustituto de gets, sin el inconveniente de que recoge el caracter '\n' lo siguiente:

Código
  1. scanf("%[^'\n']", cadena);

Pues recogerá, también, espacios y tabulaciones. Si se usa el entero delimitador de caracteres se tiene la seguridad de no sobrepasar el buffer:

Código
  1. scanf("%16[^'\n']", cadena);



Si no trabajas con linux u otro *nix y puedes hacer uso de 'man' en tu consola, escribe 'man <nombre_de_funcion>' en tu buscador de internet. Te llevará rápidamente a las páginas de los manuales de estos SS.OO. que también están publicadas en la red.
« Última modificación: 16 Junio 2016, 20:12 pm por MAFUS » En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Consulta) [C] ¿Usar los corchetes para delimitar caracteres es ANSI?
« Respuesta #4 en: 17 Junio 2016, 01:32 am »

Vale!!! Muchas gracias :D



¿Podría hacer fscanf(archivo, "%s['\n'' '", cadena)? (Nótese el espacio entre ' ')
« Última modificación: 17 Junio 2016, 01:53 am por Eternal Idol » En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Consulta) [C] ¿Usar los corchetes para delimitar caracteres es ANSI?
« Respuesta #5 en: 17 Junio 2016, 01:44 am »

¿Podría hacer fscanf(archivo, "%s['\n'' '", cadena)? (Nótese el espacio entre ' ')
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: (Consulta) [C] ¿Usar los corchetes para delimitar caracteres es ANSI?
« Respuesta #6 en: 18 Junio 2016, 13:54 pm »

Bueno, la cadena de control no empieza por %s sino por %[.
Así como lo has puesto lo que va a hacer es recoger una cadena hasta el primer espacio/tabulador/nueva linea, después esperará los caracteres ['\n'' ' y los descartará (si aparecen otros caracteres que no sean esos el comportamiento no está definido.
De igual forma cuándo abres unos corchetes debes cerrarlos. Así la cadena de control que pretendes construir es:
Código:
%['\n' ]
Nótese que hay un espacio entre el carácter de nueva línea y el corchete.
Esto hará la función espere una cadena formada por caracteres nueva línea y espacio y, al menos, deberá empezar por uno de estos dos. Cuándo se encuentre con otros caracteres distintos se detendrá.
Si lo que quieres es que capture toda la cadena hasta encontrar uno de estos caracteres debes negar esa cadena mediante el operador ^. Así:
Código:
%[^'\n' ]
En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Consulta) [C] ¿Usar los corchetes para delimitar caracteres es ANSI?
« Respuesta #7 en: 18 Junio 2016, 19:58 pm »

Vaya, cuantos detalles. Si, tienes toda la razón. Estoy de un despistado... xD
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines