Viernes 8 de Noviembre de 2024, 18:43
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
[C] fgets y línea innecesaria [Solucionado]
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: [C] fgets y línea innecesaria [Solucionado] (Leído 7180 veces)
Amphoth3ra
Nuevo Miembro
Mensajes: 7
[C] fgets y línea innecesaria [Solucionado]
«
en:
Jueves 9 de Junio de 2011, 01:13 »
0
Estoy practicando un poco de fgets con cadenas y me he encontrado con algo bastante extraño, que consiste en que las cadenas que yo entrego de entrada, me salen correctas, pero me salen con una línea de más.
Les explico con código en mano. Esta aplicación pretende guardar en una estructura temporal cuatro datos
1) El nombre de un DVD
2) El género de un DVD
3) El número de discos de un DVD
4) La duración total del DVD en minutos
Código: C
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct
dvd
{
char
name
[
255
]
;
char
genero
[
50
]
;
int
discs_number
;
int
length
;
}
;
int
main
(
)
{
struct
dvd temporal
;
char
discs_number
[
2
]
;
char
length
[
4
]
;
printf
(
"Nombre del DVDn"
)
;
fgets
(
temporal.
name
,
255
,
stdin
)
;
printf
(
"%sn"
,
temporal.
name
)
;
printf
(
"Género del DVDn"
)
;
fgets
(
temporal.
genero
,
50
,
stdin
)
;
printf
(
"%sn"
,
temporal.
genero
)
;
printf
(
"Número de discos del DVDn"
)
;
fgets
(
discs_number
,
2
,
stdin
)
;
temporal.
discs_number
=
atoi
(
discs_number
)
;
printf
(
"%dn"
,
temporal.
discs_number
)
;
printf
(
"Duración del DVDn"
)
;
while
(
getchar
(
)
!=
'n'
)
;
fgets
(
length
,
4
,
stdin
)
;
temporal.
length
=
atoi
(
length
)
;
printf
(
"%dn"
,
temporal.
length
)
;
return
(
0
)
;
}
Cuando ejecuto el programa, si introducen el nombre del DVD, la cadena que se me regresa es correcta cuando yo haga el printf, pero automáticamente se me salta una línea. Lo mismo pasa con el género del DVD.
Los campos de número de discos y de duración del DVD funcionan correctamente.
Pruébenlo con estos datos:
Nombre: Batman
Género: Acción
Número de discos: 1
Duración; 126
¿Que puede estar pasando? (por cierto, mi código está compilado con GCC)
Saludos!
Tweet
«
última modificación: Domingo 12 de Junio de 2011, 14:03 por Amphoth3ra
»
su -
Moderador
Mensajes: 2349
Re: fgets y línea innecesaria
«
Respuesta #1 en:
Sábado 11 de Junio de 2011, 05:45 »
0
fgets toma todo el contenido de la linea, incluyendo el fin de linea (el "n" cunado presionas enter).
*******PELIGRO LEE ESTO!!*******
There is no place like 127.0.0.1
Conecto luego existo, no conecto luego insisto.
Amphoth3ra
Nuevo Miembro
Mensajes: 7
Re: fgets y línea innecesaria
«
Respuesta #2 en:
Sábado 11 de Junio de 2011, 13:52 »
0
De esto deduzco que el fgets no me servirá si lo que quiero es poner todos los datos de la estructura en una sola línea, ya que para los campos 1 y 2 me toma el fin de la línea.
Me explico, lo que yo quiero es que los datos de la estructura se puedan imprimir así:
Batman Acción 1 126
Pero en realidad ahora se imprimen así:
Batman
Acción
1 126
¿Existe otra manera de que yo pueda guardar el string sin el salto de línea?
Saludos!
ProfesorX
Moderador
Mensajes: 796
Nacionalidad:
Re: fgets y línea innecesaria
«
Respuesta #3 en:
Domingo 12 de Junio de 2011, 03:18 »
0
Cita de: "Amphoth3ra"
¿Existe otra manera de que yo pueda guardar el string sin el salto de línea?
Bueno, podrias usar la funcion strchr() para buscar el caracter de salto de linea, y reemplazarlo con el caracter de fin de cadena. De esa manera te evitarias ese problema. A continuacion te dejo el codigo de como hacerlo:
Código: C++
#include<cstdio>
#include<cstdlib>
#include<cstring>
struct
dvd
{
char
name
[
255
]
;
char
genero
[
50
]
;
int
discs_number
;
int
length
;
}
;
int
main
(
)
{
struct
dvd temporal
;
char
discs_number
[
2
]
;
char
length
[
4
]
;
char
*
pch
;
printf
(
"Nombre del DVDn"
)
;
fgets
(
temporal.
name
,
255
,
stdin
)
;
// Buscas la posicion del caracter nueva linea (10) en la cadena
pch
=
strchr
(
temporal.
name
,
10
)
;
// Si la encontro, reemplazas nueva linea con nulo, que es el fin
// de cadena (' ')
if
(
pch
!
=
NULL
)
{
*
pch
=
' '
;
}
printf
(
"%sn"
, temporal.
name
)
;
printf
(
"Género del DVDn"
)
;
fgets
(
temporal.
genero
,
50
,
stdin
)
;
pch
=
strchr
(
temporal.
genero
,
10
)
;
if
(
pch
!
=
NULL
)
{
*
pch
=
' '
;
}
printf
(
"%sn"
, temporal.
genero
)
;
printf
(
"Número de discos del DVDn"
)
;
fgets
(
discs_number,
2
,
stdin
)
;
temporal.
discs_number
=
atoi
(
discs_number
)
;
printf
(
"%dn"
, temporal.
discs_number
)
;
printf
(
"Duración del DVDn"
)
;
while
(
getchar
(
)
!
=
'n'
)
;
fgets
(
length,
4
,
stdin
)
;
temporal.
length
=
atoi
(
length
)
;
printf
(
"%dn"
, temporal.
length
)
;
printf
(
"%s %s %d %d"
, temporal.
name
, temporal.
genero
, temporal.
discs_number
, temporal.
length
)
;
return
(
0
)
;
}
Ojala se adapte a lo que necesitas.
Saludos
NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================
Amphoth3ra
Nuevo Miembro
Mensajes: 7
Re: fgets y línea innecesaria
«
Respuesta #4 en:
Domingo 12 de Junio de 2011, 13:46 »
0
Funcionó perfecto men, era justo lo que necesitaba, muchas gracias =)
Saludos!
su -
Moderador
Mensajes: 2349
Re: [C] fgets y línea innecesaria [Solucionado]
«
Respuesta #5 en:
Domingo 12 de Junio de 2011, 19:02 »
0
Cuidado con la solucion de ProfesorX ya que en Windows el fin de linea esta dado por los caracteres 13 y 10 ("rn"), asi que tocaria hacerlo 2 veces, una para hallar "r" y la otra para "n".
Mejor usa sscanf para quitar el fin de linea o fscanf para leer sin este.
Código: C
int
main
(
void
)
{
char
linea
[
50
]
;
fscanf
(
stdin
,
"%s"
,
linea
)
;
printf
(
"Leido: %sn"
,
linea
)
;
return
0
;
}
Tambien podes hacer tu propia funcion donde lees de
stdin
caracter por caracter hasta hallar el caracter 13 o 10.
*******PELIGRO LEE ESTO!!*******
There is no place like 127.0.0.1
Conecto luego existo, no conecto luego insisto.
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
[C] fgets y línea innecesaria [Solucionado]