[Çözüldü] yazdığım C++ programındaki hatam için yardım eder misiniz

Başlatan ezgieren, 06 Eylül 2016 - 17:31:21

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

ezgieren

merhaba arkadaşlar yazdığım program şöyle: programın altında hatamı yazıcam.


#include<iostream>
#include<time.h>
#include<stdlib.h>
#include<locale.h>
void sifreolustur(char sifre[], int uzunluk, bool sart);
using namespace std;
int main()
{
programbasi:
int x,a,b,c;
char sifre[25], kullaniciadi[25],cevap;
srand(time(0));
setlocale(LC_ALL,"Turkish");//Türkçe karakterleri göstermek için
do // do while döngüsü başlangıcı
{
cout<<"PROGRAMLAR"<<endl;
cout<<"1.As400"<<endl;
cout<<"2.Integra"<<endl;
cout<<"3.Netsis"<<endl;
cout<<"Kullanmak istediginiz programi seciniz:(cikmak icin 0)"<<endl;
cin>>x;
switch(x)
{
case 1:
cout<<"AS400 icin kullanici adinizi giriniz:";
cin>>kullaniciadi;
sifreolustur(sifre,6,0);//0: türkçe karakter de olabilir
cout<<"AS400 icin sifreniz: "<<sifre<<endl;
break;
case 2:
cout<<"INTEGRA icin kullanici adinizi giriniz:";
cin>>kullaniciadi;
sifreolustur(sifre,10,1);//1: TR karakter olmayan özel karakter olan
cout<<"INTEGRA icin sifreniz: "<<sifre<<endl;
break;
case 3:
cout<<"NETSIS icin kullanici adinizi giriniz:";
cin>>kullaniciadi;
sifreolustur(sifre,8,1);//1: TR karakter olmaya özel karakter olan
cout<<"Netsis icin sifreniz: "<<sifre<<endl;
break;
default:
cout<<"Yanlis aralikta bir deger girdiniz."<<endl;
break;
}//switch sonu
if(x>0&&x<4)
{
cout<<"Sifrenizi mail olarak gondermek ister misiniz?[e/h]\n";
cin>>cevap;
if(cevap=='e'|| cevap=='E')
{
printf("mail adresinizi giriniz:\n");
//burada mail adresinin alınıp mail gönderilmesi
}
}
}while(x>0);//do while döngüsü sonu
return 0;
}
void sifreolustur(char sifre[], int uzunluk, bool sart)//sart=1 özel karakter olan TR karakter olmayan, sart=0, tüm karakterler olabilir.
{
char sifredizisi[]="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ&|~.:,<>-+()%'/#?!$ÇçĞğİiÖöŞşÜü";
    //10 rakam, 26 küçük harf, 26 büyük harf, 19 özel karakter(başka özel karakterlerde olabilir), 12 türkçe karakter toplam 93 karakter
    int mod,i=0,rastgeleindis;
    bool ozelkarakter;
if(sart==1)//türkçe karakter olmayacak, özel karakter olacak
    {
ozelkarakter=0;
while(i<uzunluk)
{
rastgeleindis=rand()%81;
if(rastgeleindis>61)//*61-82 arası
ozelkarakter=1;
sifre[i]=sifredizisi[rastgeleindis];
i++;
if(i==uzunluk&&ozelkarakter==0)//şifrenin sonuna gelindiği halde özel karakter yoksa
i=0;//başa dönüyor
}
sifre[uzunluk]='\0'; // char dizisini sonlandırıcı karakter
}
else if(sart==0)//tüm karakterlerden olabilir.
{
while(i<uzunluk)
{
rastgeleindis=rand()%93;
sifre[i]=sifredizisi[rastgeleindis];
i++;
}
sifre[uzunluk]='\0'; // char dizisini sonlandırıcı karakter
}
}



Arkadaşlar benim burdaki düzeltmeye çalıştığım yer şifrenizi mail olarak almak istiyor musunuz sorusuna E olarak cevap gelince program kullanıcıdan mail adresini girmesini istiyor buraya kadar sorun yok fakat kullanıcı mail adresini girmeden program baştan başlıyor. Programın baştan başlaması sadece H cevabında olmalı. Bunu nasıl düzelticeğimi bilmiyorum yardım ederseniz çok sevinirim, şimdiden teşekkürler

bugra9

Merhaba,

Alıntı Yap
fakat kullanıcı mail adresini girmeden program baştan başlıyor.
Çünkü kullanıcıdan mail adresini alacağın bir kod eklememişsin.

Alıntı YapProgramın baştan başlaması sadece H cevabında olmalı
e ile içeri girildiğinde x değişkenine -1 değerini ata. Başa dönmeden sonlanacaktır.

afeser

Hocam ben c++ hiç kullanmadım ama benzer bir sorunu c ile yaşamıştım. Nedeni ise ilk scanf kullanırken sadece yazdığımız karakterin basılmaması. Yani yanında \n de basılması. Bende de scanf() fonksiyonu kullanıldıktan sonra 3. scanf() çağrımda kendiliğinden kapanıyordu.
--//burada mail adresinin alınıp mail gönderilmesi-- burada doğru kod olduğunu varsayarak.
http://stackoverflow.com/questions/9441501/c-function-skips-user-input-in-code şu benim sorunumu çözmüştü. scanf(" &c",&c);
http://stackoverflow.com/questions/21439059/c-fgets-skips-user-input ayrıca şu da var denemediğim.

Birde şifre oluşturmak için rand() kullanman biraz riskli. rand() tam olarak rasgele sayı üretmez bellekteki rasgele değerleri atar. Farkı ne dersen de şu ki rand() fonksiyonu bir süre sonra tekrar etmeye başlar ve dizinin bilgisini çözersen gelecek şifreyi de tahmin edebilirsin. Java için SecureRandom var ama C karşılığını bilmiyorum.

Bir de gözüme çarptı:

{
case 1:
cout<<"AS400 icin kullanici adinizi giriniz:";
cin>>kullaniciadi;
sifreolustur(sifre,6,0);//0: türkçe karakter de olabilir
cout<<"AS400 icin sifreniz: "<<sifre<<endl;
break;
case 2:
cout<<"INTEGRA icin kullanici adinizi giriniz:";
cin>>kullaniciadi;
sifreolustur(sifre,10,1);//1: TR karakter olmayan özel karakter olan
cout<<"INTEGRA icin sifreniz: "<<sifre<<endl;
break;
case 3:
cout<<"NETSIS icin kullanici adinizi giriniz:";
cin>>kullaniciadi;
sifreolustur(sifre,8,1);//1: TR karakter olmaya özel karakter olan
cout<<"Netsis icin sifreniz: "<<sifre<<endl;
break;
default:
cout<<"Yanlis aralikta bir deger girdiniz."<<endl;
break;
}//switch sonu
if(x>0&&x<4)
{
cout<<"Sifrenizi mail olarak gondermek ister misiniz?[e/h]\n";
cin>>cevap;
if(cevap=='e'|| cevap=='E')
{
printf("mail adresinizi giriniz:\n");
//burada mail adresinin alınıp mail gönderilmesi
}
}
}

Yerine :

{
case 1:
cout<<"AS400 icin kullanici adinizi giriniz:";
cin>>kullaniciadi;
sifreolustur(sifre,6,0);//0: türkçe karakter de olabilir
cout<<"AS400 icin sifreniz: "<<sifre<<endl;
break;
case 2:
cout<<"INTEGRA icin kullanici adinizi giriniz:";
cin>>kullaniciadi;
sifreolustur(sifre,10,1);//1: TR karakter olmayan özel karakter olan
cout<<"INTEGRA icin sifreniz: "<<sifre<<endl;
break;
case 3:
cout<<"NETSIS icin kullanici adinizi giriniz:";
cin>>kullaniciadi;
sifreolustur(sifre,8,1);//1: TR karakter olmaya özel karakter olan
cout<<"Netsis icin sifreniz: "<<sifre<<endl;
break;
default:
cout<<"Yanlis aralikta bir deger girdiniz."<<endl;
continue;
}//switch sonu
cout<<"Sifrenizi mail olarak gondermek ister misiniz?[e/h]\n";
cin>>cevap;
if(cevap=='e'|| cevap=='E')
{
printf("mail adresinizi giriniz:\n");
//burada mail adresinin alınıp mail gönderilmesi
        }
}

kullanabilirsin daha okunaklı görünüyor.
Gelecek illa ki gelecek, önemli olan kimin getirdiği...

ezgieren

Çok teşekkür ederim arkadaşlar hallettim, şuan tek sorunum C++ da maili gönderme  :)