Çözüldü C/C++ Vs Gets hatası

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

haticeboomin

Zeptopat
Katılım
12 Aralık 2024
Mesajlar
3
Daha fazla  
Cinsiyet
Kadın
Visual Studio kodun gets bölümünü okumuyor sebebi ne olabilir?

#İnclude <stdio.h>

İnt isimver()
{
Char listeisim[50];
Printf("\nbir isim giriniz: ");
Gets(listeisim);
Printf("listenizin yeni adi:%s",listeisim);
Return 0;
}
 
Son düzenleyen: Moderatör:
Çözüm
bunları denedim ama yine de çalışmadı gets kodlarını görmeden alt satıra geçiyor

fgets() veya eski gets() fonksiyonları kullanıcıdan veri alırken yeni satır karakterini (\n) da alır eğer kullanıcı sadece enter tuşuna basarsa bu yeni satır karakteri okuma işlemi olarak kabul edilir ve program alt satıra geçer.

Çözüm: Eğer sadece boş bir girdiyle karşılaşıyorsanız bu durumu kontrol edip işlem yapabilirsiniz ayrıca yeni satır karakterini temizlemek için şu kodu kullanabilirsiniz:
C:
fgets(listeisim, sizeof(listeisim), stdin);
listeisim[strcspn(listeisim, "\n")] = '\0';

Eğer önceki bir input fonksiyonu stdin'i temizlemeden işlemi tamamladıysa örneğin scanf() kullanıldıysa fgets() fonksiyonu hemen bir yeni satır (\n) karakterini alabilir ve giriş işlemi sonlanabilir.

Çözüm: stdin'in temizlenmesi gerekebilir eğer önceki inputlardan kalan veriyi temizlemek istiyorsanız şunu ekleyebilirsiniz:
C:
while (getchar() != '\n');
fgets(listeisim, sizeof(listeisim), stdin);

Eğer hata hala devam ediyorsa kodun doğru şekilde çalışıp çalışmadığını görmek için çok basit bir giriş kontrolü ekleyebilirsiniz:
C:
#include <stdio.h>

int isimver() {
    char listeisim[50];
    printf("\nbir isim giriniz: ");
    fgets(listeisim, sizeof(listeisim), stdin);

    if (listeisim[0] == '\n') {
        printf("Boş girdi alındı. Lütfen tekrar giriniz.\n");
    } else {
        printf("Listenizin yeni adi: %s", listeisim);
    }
    return 0;
}

int main() {
    isimver();
    return 0;
}

Bu kod eğer kullanıcı boş bir input yalnızca enter girerse bu durumu tespit edip ekrana hata mesajı verecektir.
Visual Studio kodun gets bölümünü okumuyor sebebi ne olabilir?

#İnclude <stdio.h>

İnt isimver()
{
Char listeisim[50];
Printf("\nbir isim giriniz: ");
Gets(listeisim);
Printf("listenizin yeni adi:%s",listeisim);
Return 0;
}

Yukarıdaki kod, gets fonksiyonunu kullanarak kullanıcıdan veri almaya devam eder. Ancak, Visual Studio gibi modern derleyicilerde, gets fonksiyonu devre dışı bırakılabilir veya uyarı verebilir, çünkü güvenlik açısından önerilmez.

C:
#include <stdio.h>

int isimver()
{
 char listeisim[50];
 printf("\nbir isim giriniz: ");
 fgets(listeisim, sizeof(listeisim), stdin); // Güvenli veri girişi
 printf("listenizin yeni adi: %s", listeisim);
 return 0;
}

int main() {
 isimver(); // fonksiyonu çağırıyoruz
 return 0;
}
 
Oncelikle;
Sosyal'de nasıl kod paylaşılır?

Ikincil olarak;
Never use gets(). Because it is impossible to tell without knowing the data in advance how many characters gets() will read, and because gets() will continue to store characters past the end of the buffer, it is extremely dangerous to use. It has been used to break computer security. Use fgets() instead.
Cevirisi;
Asla gets() kullanma. Cunku gelecek veriyi onceden bilmeden gets()'in kac karakter okuyacagini bilemezsin, ve gets() buffer'in sonunu gectiginde bile karakterleri depolamaya devam edecek, kullanmak icin asiri tehlikeli. Bilgisayar guvenligini kirmak icin kullaniliyor. Yerine fgets() kullan.
Kaynak; https://linux.die.net/man/3/gets


VS 2015'ten beri gets CRT'nin bir parcasi degil. Obsolete. MSDN dokumantasyonu gets_s tavsiye ediyor.

Senin kullanacagin ornek;
C:
// crt_gets_s.c
// This program retrieves a string from the stdin and
// prints the same string to the console.

#include <stdio.h>

int main( void )
{
   char line[21]; // room for 20 chars + '\0'
   gets_s( line, 20 );
   printf( "The line entered was: %s\n", line );
}
 
gets fonksiyonu, güvenlik açısından riskler taşıdığı için modern C derleyicilerinde genellikle önerilmez ve bazı derleyicilerde kullanılmasına izin verilmez. Çünkü gets, kullanıcının girdiği verinin uzunluğunu kontrol etmez, bu da "buffer overflow" hatalarına yol açabilir. Bu yüzden, Visual Studio gibi modern derleyicilerde gets kullanmaya çalıştığınızda, kodunuzun düzgün çalışmaması veya hiç derlenmemesi ihtimali yüksek.

Bunun yerine "scanf" kullanabilirsiniz
 

Yukarıdaki kod, gets fonksiyonunu kullanarak kullanıcıdan veri almaya devam eder. Ancak, Visual Studio gibi modern derleyicilerde, gets fonksiyonu devre dışı bırakılabilir veya uyarı verebilir, çünkü güvenlik açısından önerilmez.

C:
#include <stdio.h>

int isimver()
{
 char listeisim[50];
 printf("\nbir isim giriniz: ");
 fgets(listeisim, sizeof(listeisim), stdin); // Güvenli veri girişi
 printf("listenizin yeni adi: %s", listeisim);
 return 0;
}

int main() {
 isimver(); // fonksiyonu çağırıyoruz
 return 0;
}
bunları denedim ama yine de çalışmadı gets kodlarını görmeden alt satıra geçiyor
 
bunları denedim ama yine de çalışmadı gets kodlarını görmeden alt satıra geçiyor
Gormeden alt satira geciyor derken? Input beklemiyor mu demeye calisiyorsun? Anlamiyorum. Bir seyi dedigimden farkli yapiyor olmalisin. Kod calisiyor cunku.
1734017689955.png
 
bunları denedim ama yine de çalışmadı gets kodlarını görmeden alt satıra geçiyor

fgets() veya eski gets() fonksiyonları kullanıcıdan veri alırken yeni satır karakterini (\n) da alır eğer kullanıcı sadece enter tuşuna basarsa bu yeni satır karakteri okuma işlemi olarak kabul edilir ve program alt satıra geçer.

Çözüm: Eğer sadece boş bir girdiyle karşılaşıyorsanız bu durumu kontrol edip işlem yapabilirsiniz ayrıca yeni satır karakterini temizlemek için şu kodu kullanabilirsiniz:
C:
fgets(listeisim, sizeof(listeisim), stdin);
listeisim[strcspn(listeisim, "\n")] = '\0';

Eğer önceki bir input fonksiyonu stdin'i temizlemeden işlemi tamamladıysa örneğin scanf() kullanıldıysa fgets() fonksiyonu hemen bir yeni satır (\n) karakterini alabilir ve giriş işlemi sonlanabilir.

Çözüm: stdin'in temizlenmesi gerekebilir eğer önceki inputlardan kalan veriyi temizlemek istiyorsanız şunu ekleyebilirsiniz:
C:
while (getchar() != '\n');
fgets(listeisim, sizeof(listeisim), stdin);

Eğer hata hala devam ediyorsa kodun doğru şekilde çalışıp çalışmadığını görmek için çok basit bir giriş kontrolü ekleyebilirsiniz:
C:
#include <stdio.h>

int isimver() {
    char listeisim[50];
    printf("\nbir isim giriniz: ");
    fgets(listeisim, sizeof(listeisim), stdin);

    if (listeisim[0] == '\n') {
        printf("Boş girdi alındı. Lütfen tekrar giriniz.\n");
    } else {
        printf("Listenizin yeni adi: %s", listeisim);
    }
    return 0;
}

int main() {
    isimver();
    return 0;
}

Bu kod eğer kullanıcı boş bir input yalnızca enter girerse bu durumu tespit edip ekrana hata mesajı verecektir.
 
Çözüm
Gormeden alt satira geciyor derken? Input beklemiyor mu demeye calisiyorsun? Anlamıyorum. Bir seyi dedigimden farkli yapiyor olmalisin. Kod calisiyor cunku.
Eki Görüntüle 2372732
bak bu sekilde oluyor.

fgets() veya eski gets() fonksiyonları kullanıcıdan veri alırken yeni satır karakterini (\n) da alır eğer kullanıcı sadece enter tuşuna basarsa bu yeni satır karakteri okuma işlemi olarak kabul edilir ve program alt satıra geçer.

çözüm: Eğer sadece boş bir girdiyle karşılaşıyorsanız bu durumu kontrol edip işlem yapabilirsiniz ayrıca yeni satır karakterini temizlemek için şu kodu kullanabilirsiniz:
C:
fgets(listeisim, sizeof(listeisim), stdin);
listeisim[strcspn(listeisim, "\n")] = '\0';

Eğer önceki bir input fonksiyonu Stdin'i temizlemeden işlemi tamamladıysa örneğin scanf() kullanıldıysa fgets() fonksiyonu hemen bir yeni satır (\n) karakterini alabilir ve giriş işlemi sonlanabilir.

çözüm: Stdin'in temizlenmesi gerekebilir eğer önceki inputlardan kalan veriyi temizlemek istiyorsanız şunu ekleyebilirsiniz:
C:
while (getchar() != '\n');
fgets(listeisim, sizeof(listeisim), stdin);

Eğer hata hala devam ediyorsa kodun doğru şekilde çalışıp çalışmadığını görmek için çok basit bir giriş kontrolü ekleyebilirsiniz:
C:
#include <stdio.h>

int isimver() {
 char listeisim[50];
 printf("\nbir isim giriniz: ");
 fgets(listeisim, sizeof(listeisim), stdin);

 if (listeisim[0] == '\n') {
 printf("Boş girdi alındı. Lütfen tekrar giriniz.\n");
 } else {
 printf("Listenizin yeni adi: %s", listeisim);
 }
 return 0;
}

int main() {
 isimver();
 return 0;
}

Bu kod eğer kullanıcı boş bir input yalnızca enter girerse bu durumu tespit edip ekrana hata mesajı verecektir.

Cok teşekkür ederim cözüldü şu an.
 

Dosya Ekleri

  • Ekran görüntüsü 2024-12-12 201809.png
    Ekran görüntüsü 2024-12-12 201809.png
    25,7 KB · Görüntüleme: 19
  • Ekran görüntüsü 2024-12-12 201915.png
    Ekran görüntüsü 2024-12-12 201915.png
    25,7 KB · Görüntüleme: 23
Son düzenleme:

Technopat Haberler

Yeni konular

Geri
Yukarı