[Çözüldü] fgets fonksiyonu fazla değer alırsa

Başlatan Neof07, 04 Ağustos 2016 - 12:36:02

« önceki - sonraki »

0 Üyeler ve 2 Ziyaretçi konuyu incelemekte.

Neof07

Merhaba arkadaşlar, aşağıda bir kod paylaşıcam ve burada ki sorunumu çıktısı ile beraber size göstericem.
#include <stdio.h>
#include <string.h>
main(){
char sifre[5];
int hak=3;
while(hak>0){
printf("Sifreyi girin: (%d)",hak);
fgets(sifre,4,stdin);
if(strcmp(sifre,"root")==0){
printf("Sifre dogru!"); break;
}
else{ system("clear");
hak--;
}
}
}

*****
Çıktısı:
Sifreyi girin: (3)elmaaa
Sifreyi girin: (2)Sifreyi girin: (1)

vee program bitiyor...
fgets ile en fazla 4 karakterli bir giriş bekliyorum ancak fazlasını girdiğimde sanırım girilen fazla karakterleri diğer girişlere aktarıyor. Bunu nasıl engelleyebilirim ?
Bu problemi scanf ile yapınca çözüyorum ancak gcc bana uyarı veriyor bunuda görmezden gelmek istemedim aşağıda da gcc nin scanf kullandığımda verdiği uyarı:
gcc deneme.c -o dene
-------------
deneme.c:8:1: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[5]' [-Wformat=]
scanf("%s",&sifre);


Tabii bu scanf("%s",&sifre); adres karakterini koyunca oluyor, onu kaldırınca sorun ortadan kalkıyor. Sanırım bu zaten, char dizisi başlangıç adresini tuttuğu için adres karakterine gerek duymuyor ancak neden "&" koyunca uyarı veriyor. Boşu boşuna uyarı vermez ya ileride bana sorun çıkartıcak tarzda bir işlem mi acaba ?

UykusuzBizon

Şifrenin doğru olduğunu kabul etmesi için ;
fgets(sifre,4,stdin);
bu kısımdaki tamsayıyı 5 yapmanız gerekiyor.

"n -- This is the maximum number of characters to be read (including the final null-character). Usually, the length of the array passed as str is used."
http://www.tutorialspoint.com/c_standard_library/c_function_fgets.htm

Devamına da bakacağım ama o küçük bilgi dursun kenarda.
Beni doyurmuyor ne para ne sistemin masalı.

MetinErsin

fgets fonksiyonundan önce rewind(stdin) yazarsan sorun çözülür. Ve fgets de 5 karakter okuman lazım null karakterde var çünkü.

Neof07

fgets ile 5 karakterden fazla okuyunca diğer girişler iptal oluyor zaten sorunda orası

Amenofis

Arkadaş söylemiş zaten, rewind ile işaretçiyi başa alacaksın. Ancak girilecek kelimeyi 4-5 karakterle sınırlamak nedir orasını çözemedim. Yani ben domates yazmak istesem yazamayacak mıyım?

Neof07

Yazılınca diğer girişleri pas geçiyor o yüzden

7hr33l3t73r

#6
/*
* =====================================================================================
*       Filename:  hak.c
*
*        Version:  1.0
*        Created:  08/05/2016 12:14:34 AM
*       Revision:  none
*       Compiler:  gcc
*
*         Author:  8100d1r0n (https://github.com/8100d1r0n)
*         E-Mail:  echo "ODEwMGQxcjBuKGF0KXJpc2V1cChkb3QpbmV0Cg=="|base64 -d
* =====================================================================================
*/
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
    char sifre[100];
    int hak=3;
    while (hak>0) {
        printf("Sifreyi giriniz: (%d)\n",hak);
        fgets(sifre,sizeof(sifre),stdin);
        sifre[strlen(sifre)-1]='\0';
        if (strcmp(sifre,"root")==0) {
            printf("Sifre dogru\n"); break;
        }
        else {
            system("clear");
            hak--;
        }
    }
}
dc -e '[q]sa[ln0=aln256%Pln256/snlbx]sb207356256404211981204295703670388snlbxq'
https://www.getgnu.org/gnulinux/gnulinux-ipuclari/nasil-akillica-soru-sorulur.html

Neof07

1. girişte yanlış şifre girince 2. atlıyor en sonuncusu çalışıyor. Sorunumda buydu zaten. @8100d1r0n

7hr33l3t73r

Alıntı yapılan: Neof07 - 05 Ağustos 2016 - 12:33:51
1. girişte yanlış şifre girince 2. atlıyor en sonuncusu çalışıyor. Sorunumda buydu zaten. @8100d1r0n
?
dc -e '[q]sa[ln0=aln256%Pln256/snlbx]sb207356256404211981204295703670388snlbxq'
https://www.getgnu.org/gnulinux/gnulinux-ipuclari/nasil-akillica-soru-sorulur.html

Neof07

Yazdığın koddaki değişiklikleri kendi kodumda uyguladım ancak biz 3 hak vermiştik kullanıcıya. 1. hakkında yanlış girince 2. hakkı geçiyor girmesini beklemiyor diğer hakka yani 3. hakka geçiyor. Ayrıca doğru şifre girince kabul etmiyor. Scanf ile yaptığımda sorun olmamıştı ancak fgets ile yapmak istemiştim.

7hr33l3t73r

#10
Vidyo ekler kisminda.
Sadece pc de uzantisini mkv olarak degistrin.
dc -e '[q]sa[ln0=aln256%Pln256/snlbx]sb207356256404211981204295703670388snlbxq'
https://www.getgnu.org/gnulinux/gnulinux-ipuclari/nasil-akillica-soru-sorulur.html

Neof07

Teşekkür ederim çözüldü. Bu arada rewind fonk.bilmiyordum.