No me funcionan correctamente las cadenas de formato

Iniciado por lucaslopez0000, 28 Mayo 2013, 22:52 PM

0 Miembros y 2 Visitantes están viendo este tema.

lucaslopez0000

Hola a todos , como me estaba quebrando la cabeza con este asunto , hice un programa de prueba. Se donde esta el fallo pero no como solucionarlo. La linea en cuestion es scanf("%s__%s" , &str1 , &str2); Se supone que si yo pongo qqq__zzz , deberia guardar qqq en str1 y zzz en str2. La cuestion es que me lo guarda todo en str1 y me deja vacio str2. Es decir , yo esperaba
str1 = qqq
str2 = zzz
pero el programa da
str1 = "qqq__zzz"
str2 = ""
Me estoy quebrando la cabeza y no se como puedo solucionar esto , aunque se que el error esta en la cadena de formato.
Muchas gracias por su ayuda :)
La manera mas simple de solucionar los problemas de windows , los virus , el spyware , la basura de microsoft en general

USA LINUX

BlackM4ster

Código (cpp) [Seleccionar]
scanf("%s__%s" , str1 , str2);
Prueba así a ver...
- Pásate por mi web -
https://codeisc.com

lucaslopez0000

Cita de: Black Master en 28 Mayo 2013, 23:22 PM
Código (cpp) [Seleccionar]
scanf("%s__%s" , str1 , str2);
Prueba así a ver...
Gracias por la respuesta , aunque en el mejor de los casos el compilador pone los ampersand y en el peor da error. En mi caso compila pero sigue igual que antes. Aun asi eso no se debe hacer , scanf recibe direcciones de memoria de las variables donde guarda los datos , no las propias variables ...
La manera mas simple de solucionar los problemas de windows , los virus , el spyware , la basura de microsoft en general

USA LINUX

amchacon

Cuanto ocupa la cadena? Debe tener al menos 4 espacios para guardar qqq (recuerda que es necesario un caracter nulo para indicar el final).
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

CCross

De esta forma te deberia funciónar

Código (cpp) [Seleccionar]
#include <stdio.h>

int main()
{
    char cad[5], cad1[5];

    scanf("%s" "%s", &cad, &cad1);
    printf("%s__%s", cad, cad1);

    return 0;
}


Saludos

amchacon

Cita de: CCross en 29 Mayo 2013, 00:03 AM
De esta forma te deberia funciónar

Código (cpp) [Seleccionar]
#include <stdio.h>

int main()
{
    char cad[5], cad1[5];

    scanf("%s" "%s", &cad, &cad1);
    printf("%s__%s", cad, cad1);

    return 0;
}


Saludos
Los & del scanf sobran. Y aun asi no te compilara porque has puesto dos comillas en un mismo argumento.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

CCross

Cita de: amchacon en 29 Mayo 2013, 00:27 AM
Los & del scanf sobran. Y aun asi no te compilara porque has puesto dos comillas en un mismo argumento.
Lo acabo de compilar y ejecutar funcióna a la perfección no entiendo por que lo dices  :huh:

Saludos

rir3760

Cita de: The_C_Coder en 28 Mayo 2013, 22:52 PM
La linea en cuestion es scanf("%s__%s" , &str1 , &str2); Se supone que si yo pongo qqq__zzz , deberia guardar qqq en str1 y zzz en str2. La cuestion es que me lo guarda todo en str1 y me deja vacio str2.
Ese es el comportamiento normal de scanf con el especificador de formato "%s": leer una palabra (secuencia de caracteres delimitada por espacio blanco).

Para leer dos secuencias cuyo separador es "__" debes utilizar, por poner un ejemplo:
#include <stdio.h>
#include <stdlib.h>

#define NUM_CHARS  80

int main(void)
{
   char a[NUM_CHARS];
   char b[NUM_CHARS];
   
   printf("Palabras separadas por \"__\": ");
   fflush(stdout);
   if (scanf(" %[^_]__%[^_\n]", a, b) == 2){
      printf("a: %s\n", a);
      printf("b: %s\n", b);
   }
   
   return EXIT_SUCCESS;
}


----

Cita de: The_C_Coder en 28 Mayo 2013, 23:38 PM
Cita de: Black Master en 28 Mayo 2013, 23:22 PM
Código (cpp) [Seleccionar]
scanf("%s__%s" , str1 , str2);
Prueba así a ver...
Gracias por la respuesta , aunque en el mejor de los casos el compilador pone los ampersand y en el peor da error. En mi caso compila pero sigue igual que antes. Aun asi eso no se debe hacer , scanf recibe direcciones de memoria de las variables donde guarda los datos , no las propias variables ...
Si str1 y str2 son los nombres de dos arrays de caracteres no es necesario utilizar el operador "dirección de" en la llamada a scanf.

----

Cita de: amchacon en 29 Mayo 2013, 00:27 AM
Cita de: CCross en 29 Mayo 2013, 00:03 AM
De esta forma te deberia funciónar

Código (cpp) [Seleccionar]
#include <stdio.h>

int main()
{
    char cad[5], cad1[5];

    scanf("%s" "%s", &cad, &cad1);
    printf("%s__%s", cad, cad1);

    return 0;
}
Los & del scanf sobran. Y aun asi no te compilara porque has puesto dos comillas en un mismo argumento.
El uso de dos cadenas literales seguidas:
scanf("%s" "%s", &cad, &cad1);
No es un error ya que se concatenan resultando en una sola. Esa llamada a funcion es equivalente a:
scanf("%s%s", &cad, &cad1);

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

amchacon

Cita de: rir3760 en 29 Mayo 2013, 01:39 AMNo es un error ya que se concatenan resultando en una sola. Esa llamada a funcion es equivalente a:
scanf("%s%s", &cad, &cad1);
Tomo nota, es una delicia aprender cosas nuevas  :rolleyes:

Cita de: CCross en 29 Mayo 2013, 00:36 AM
Lo acabo de compilar y ejecutar funcióna a la perfección no entiendo por que lo dices  :huh:
¿Pero en los & tenía razón?  :silbar:
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

CCross

#9
Cita de: amchacon en 29 Mayo 2013, 01:42 AM
¿Pero en los & tenía razón?  :silbar:

Si los & son redundantes ya que el nombre del array es un puntero inicializado con la dirección
del primer elemento del array de caracteres.

Saludos amchacon  ::)