Hola a todos, me han dejado algunos ejercicios en #C y he resolvido la mayoría, pero me atore en este, creo que trata sobre comparar cadenas, me pide que use un ciclo WHILE de cierta forma que si se escribe la frase "abrete sesamo" el programa se cierra, pero si no el programa sigue pidiendo la frase para que se cumpla el ciclo y se cierre, y pues la verdad no se como comparar "LETRAS". Rápidamente a mi se me ha ocurrido algo asi:
Citar#include <stdio.h>
int main()
{
char a;
printf ("Escribe la contraseña correcta \n");
scanf ("%c", &a);
b:
while (a=="abrete sesamo\n");
{
exit(0);
}
goto b;
return 0;
}
Pero no lleva nada de logica, Aunque se me ha ocurrido otra idea, hace unos dias hace unos dias, a qui mismo en el foro hice una pregunta sobre como hacer para poner una contraseña a un programa, osea que no se tipea la contraseña correcta no abre las opciones del programa y si, el usuario "EXEL" me resolvio la duda de esta manera:
Citar#include <stdio.h>
#include <string.h>
#define MAX_CHAR 100
int main ()
{
char pass[MAX_CHAR];
printf("Introduzca password: \n");
fgets(pass,MAX_CHAR,stdin);
if(strcmp(pass,"batman es mi vecino")==0)
{
printf ("Contraseña verdadera\n");
}
else
{
printf ("La contraseña es incorrecta\n");
}
return 0;
}
pero la verdad no entendi muy bien eso de "strcmp", pueden orientarme si puedo usar este miismo metodo, para mi duda y agregarla al ciclo WHILE.
GRACIAS
Hola que tal,
bien strcmp lo que hace es una comparación de cadenas, y funciona enviando las 2 cadenas que necesitas comparar, de la siguiente forma :
strcmp( Cadena1, Cadena2 ), y esta te retorna un número, si retorna 0 quiere decir que las 2 cadenas son iguales, y si te retorna un número diferente de 0, es porque son diferentes.
Lo que tu estas haciendo esta mal, ya que creaste una variable de tipo carácter que solo puede almacenar un carácter, para almacenar más de un carácter, necesitas crear un vector, tal y como lo hizo EXEL, esto que hizo es que la variable que se crea pueda almacenar tantos caracteres como le hallas pedido dentro de [ ], es decir,
char pass[100];
pass, puede almacenar hasta un total de 100 caracteres, mientras que si la dejas:
char pass;
pass, puede almacenar un único carácter.
$4!u2
#include <string.h>
#include <stdio.h>
...
{
char textointroducido[50];
...
while(strcmp(texteintroducido, "fin\n")!=0) {
...
}
}
Si estás interesado mira acá (http://foro.elhacker.net/programacion_cc/comparar_cadenas_sin_usar_strcmp-t308649.0.html), hay ejemplos en los que se crea una función específica para lo que tu pides.
Hay ok, de esa forma es en la que funciona strcmp realmente no lo sabia, entonces tengo que usar eso, dentro del ciclo, intentare aserlo, y en un rato posteo lo que llevo, igual como estoy empezando me atoro mucho en C, gracias STANHMAL, se agradece... XD
intente hacer algo y esto es lo que me ha salido:
Citar#include <stdio.h>
#include <string.h>
#define MAX_CHAR 100
int main()
{
char pas[MAX_CHAR];
printf ("introduzca la frase correcta\n");
fgets(pas,MAX_CHAR,stdin);
while (strcmp(pas,"abrete sesamo")==0)
{
printf ("la frase es correcta\n");
getchar();
exit(0);
}
printf ("Frase no leida\n");
getchar();
return 0;
}
pero me marca error el exit dice lo siguiente:
ejer3.c:16:3: aviso: declaración implícita de la función 'exit' [-Wimplicit-function-declaration]
que estoy haciendo mal??
Al fin me ha quedado:
Citar#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_CHAR 100
int main()
{
char pas[MAX_CHAR];
printf ("introduzca la frase correcta\n");
fgets(pas,MAX_CHAR,stdin);
while (strcmp(pas,"ola\n")==0)
{
printf ("la frase es correcta\n");
getchar();
exit(0);
}
printf ("Frase no leida\n");
getchar();
return 0;
}
me hacia falta agregar:
#include <stdlib.h>
Gracias, me ha servido de mucho su ayuda!! :)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_CHAR 100
int main()
{
char pas[MAX_CHAR];
printf ("introduzca la frase correcta\n");
fgets(pas,MAX_CHAR,stdin);
while (strcmp(pas,"ola\n")==0)
{
printf ("la frase es correcta\n");
getchar();
exit(0);
}
printf ("Frase no leida\n");
getchar();
return 0;
}
El while ahí no tiene sentido, si lo quieres hacer así lo que va ahí es un if. En tu primer mensaje decías que el programa debia seguir pidiendo frases, hasta que la frase fuese la correcta, el tuyo no hace eso.
Ha si tienes razon, mira este si lo hace, creo, observalo y me comentas, ah y el while por que afuerzas quieren que use eso, por que bien solo seria un if-else, pero bueno
Citar#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_CHAR 100
int main()
{
char pas[MAX_CHAR];
a:
printf ("introduzca la frase correcta\n");
fgets(pas,MAX_CHAR,stdin);
while (strcmp(pas,"ola\n")==0)
{
printf ("la frase es correcta\n");
getchar();
exit(0);
}
printf ("Frase no leida\n");
getchar();
goto a;
return 0;
}
Cita de: barnix456 en 5 Mayo 2012, 18:42 PM
...
:xD olvida el goto, es mala practica de programación, de momento no se hace visible que es malo, puesto que son cosas sencillas, pero cuando son códigos realmente largos, se vuelve realmente molesto.
Mira esta otra forma.
#include <stdio.h>
#include <string.h>
#define MAX_CHAR 100
int main()
{
char pas[MAX_CHAR];
do{
printf ("introduzca la frase correcta\n");
fgets(pas,MAX_CHAR,stdin);
if(strcmp(pas,"ola\n")!=0){
printf ("la frase es incorrecta, intente nuevamente.\n");
getchar();
}
}while (strcmp(pas,"ola\n")!=0);
printf ("la frase es correcta.\n");
getchar();
return 0;
}
$4!u2
wuao!, se ve un poco raro a primera vista, pero analizandolo bien, se ve mas formal por asi decirlo, solo tengo una duda por que el:
do {
edito:
tambien esta mal, por que escribo la frase correcta "ola" y dice: frase incorrecta, y lo que deberia decir es que esta bien y salir, aparte el programa nunca se cierra, son siemples errores, intentare analizar ese nuevo modelo, eso es nuevo para mi... :)
Acortando código:
#include <stdio.h>
#include <string.h>
main()
{
char texto[100];
printf ("Introduzca la frase correcta: "); fgets(texto,sizeof(texto),stdin);
while(strcmp(texto,"hola\n")!=0) {
printf ("Error!\nIntroduzca la frase correcta: "); fgets(texto,sizeof(texto),stdin);
}
printf ("La frase es correcta.\n");
}
Joder, que aburrido estoy XD
EDIT: ¿De que libro estás aprendiendo C?
jajaja... eso estuvo bueno, vamos eso nunca se me hubiera ocurrido, esta muy bueno eh!! lo mismo pero mas pequeño
Realmente que es lo que hace esta linea:
fgets(texto,sizeof(texto),stdin);
EDITO:
Realmente de muchos libros, no solo de uno, llevo uno de análisis de algoritmos y dos de c:
1) Programacion.en.C.Metodologia.Algoritmos.y.Estructura.de.datos.Editorial.McGraw-Hill
2) Programacion en C Metodologia, Algoritmos y Estructurade datos [Luis Joyanes Aguilar & Ignacio Zahomero Martines]
3) Como.Programar.en.C.C.Plus.Plus.-.Deitel.Prentice-Hall
4) Lo que pueda aprender aqui en el foro
La definicion de fgets() es la siguiente:
char *fgets(char
*cadena, int
n, FILE
*stream);
"Basicamente dice: copiar una cadena de longitud menor a n que este en stream y guardarla en cadena"
...aunque te parezca un poco rara te explico en español lo que significa:
*stream es una fuente de donde se obtiene la cadena de caracteres, esta fuente debe ser un archivo. En tu caso
stdin es un archivo donde se almacena lo que escribes por teclado, y se denomina buffer de entrada.
n es la cantidad de caracteres que quieres obtener como maximo de
*stream. Comunmente, le asignamos a
n la longitud de tu
cadena.
cadena es el nombre de tu variable donde se debe almacenar lo que obtendas de
*stream... una restriccion que impone la funcion fgets() es la siguiente:
Citar"Ningún carácter adicional es leído después del carácter de nueva línea ('\n') o después de un final de fichero (EOF)"
:o pues a si que le entienda, no mucho tendre que practicar un poco mas sonbre esto, para que lo domine un poco, gracias EXEL
Anteriormente dijiste esto:
Cita de: barnix456 en 5 Mayo 2012, 18:54 PM
edito:
tambien esta mal, por que escribo la frase correcta "ola" y dice: frase incorrecta, y lo que deberia decir es que esta bien y salir, aparte el programa nunca se cierra, son siemples errores, intentare analizar ese nuevo modelo, eso es nuevo para mi... :)
La respuesta es que quieres comparar la cadena obtenida con fgets() con la cadena "ola\n", pero, como dije anteriormente, fgets() no puede copiar el caracter '\n'. Por eso estaras comparando "ola" con "ola\n" y nunca lograras asertar.
Saludos
Gracias, ese error no lo habia notado, pero bueno al final ya quedo! gracias de nuevo
yo había hecho una función para comparar dos cadenas, te puede servir si deseás alguna comparación con el fin de realizar un ordenamiento alfabético por ejemplo.
http://foro.elhacker.net/programacion_cc/ejemplo_de_ordenamientos_basicos-t358139.0.html
ok gracias... lo revisare, cualquier informacion es buena.. :)
amigo una ayuda en tu problema de comparar cadenas..... espero que sea de tu ayuda
#include<iostream>
using namespace std;
int main(){
char cadena1[100];
char cadena2[100];
bool rpt = true;
int i=0;
cout<<"Ingrese la primera Cadena de Texto"<<endl;
gets(cadena1);
cout<<"Ingrese la segunda Cadena de Texto"<<endl;
gets(cadena2);
cout<<endl<<"\t\t\t\tComparando"<<endl<<endl;
do{
if(cadena1[ i ]!=cadena2[ i ]){//borra los espacios entre la i y [], pues si no no me lo reconoce
rpt = false;
break;
}
i++;
}while(cadena1[ i ]!='\0' || cadena2[ i ]!='\0' );//borra los espacios entre la i y [], pues si no no me lo reconoce
if(rpt){
cout<<"La cadena de Caracteres son Identicas: ";
cout<<"comparacion "<<cadena1<<" = "<<cadena2<<endl;
}
else
cout<<"La cadena de Caracteres son diferentes: "<<endl;
system("pause");
}
Hola Rodrigosolari, es muy interesante lo que posteaste, he intentando correrlo en mi maquina, pero no puedo, me marca un error, con el #include <iostream> dice que no existe ese archivo o directorio, talvez es por mi compilador uso, geany, pero viendolo y analizandolo bien, si logro diferenciar en donde es que comparar las cadenas, entiendo bien las funciones if y while, gracias, amigo.