C programlama ad ve soyadı sırayla yazdırmak

Katılım
12 Aralık 2015
Mesajlar
6.663
Makaleler
9
Çözümler
11
Daha fazla  
Sistem Özellikleri
i7 10750H || GTX 1660 Ti 6 GB Mobile || 2x16 GB RAM || 512 GB NVMe M.2 SSD || 1080p 144 Hz IPS Panel || Windows 11-macOS Big Sur || Acer Nitro 5 AN515-55 2020 ||
Cinsiyet
Erkek
Meslek
Öğrenci
[CODE lang="c" title="Ad-Soyad"]#include <stdio.h>

int main() {

char ad[15];
char soyad[15];
int sayac=0;

if (sayac==0) {

printf("Adinizi girin...");
scanf("%[^\n]",ad);
sayac++;

}

else if (sayac==1) {

printf("Soyadinizi girin...");
scanf("%[^\n]",soyad);
sayac++;

}

else if(sayac==2) {

printf("Adiniz ve soyadiniz kaydedildi.");

printf("%c %c",ad,soyad);

}

return 0;
}[/CODE]

Yapmak istediğim şey ad ve soyadı sırayla kullanıcıdan alıp yazdırmak. Birkaç deneme yaptım ama printf ile her şey aynı anda yazılıyor. If, else vs. ile yapmak aklıma geldi ama ilk koşul hep true olduğu için bununla da yapamadım. Aklıma şu an bir şey gelmedi. Hazıra konmak gibi bir amacım yok. oldukça acemi bir C programlama öğrencisiyim diyebilirim. Direkt cevap yerine herkes için daha öğretici, sorgulayarak şunu şunu yapabilirsin vs. gibi tüyolar verilmesi daha iyi olur. Bunlarla bir neticeye ulaşamazsam da sizlerden daha somut yardım istemek zorunda kalacağım. Şimdiden teşekkürler.
 
Son düzenleyen: Moderatör:
Döngü olmadığı için sayacın değeri 0'dan başlayıp sadece ilk if'in içerisine giriyor. Main altındaki tüm kodun bir while veya for döngüsü içerisine alıp sonlandırma şartının ise sayacın 2 olmasına bağlayabilirsiniz.

Döngüsüz olması içinse if'leri kaldırabilirsiniz. O zaman sayaca da gerek kalmıyor haliyle.
 
C'nin belki de yumuşak karnı olan String'ler her zaman sıkıntı yaratmıştır.
scanf stringler için görece yetersiz bir fonksiyon. Güvenlik sorunları ile meşhur olsa da gets() kullanabilirsiniz. Kendisinin s_gets(), gets_s() gibi günvenli versiyonları da mevcut ancak Standart C Lib içerisinde var mı emin değilim.
 
Herkes bir şeyler söylemiş söyledikleri kısmen doğru ama konuyla alakalı mı tartışılır; hadi benim senin kodlarını düzenlediğim haline bakalım.

[CODE lang="c" title="Kodlar"]#include <stdio.h>

int main() {

char ad[15];
char soyad[15];
int sayac=0;

if (sayac==0) {

printf("Adinizi giriniz: ");
scanf("%s",ad);
sayac++;

}

if (sayac==1) {

printf("Soyadinizi giriniz: ");
scanf("%s",soyad);
sayac++;

}

if(sayac==2) {

printf("Adiniz ve soyadiniz kaydedildi.\nAdiniz Soyadiniz: ");

printf("%s %s",ad,soyad);

}

return 0;
}[/CODE]

Şimdi öncelikle else ifleri' direkt olarak if'e çevirdim çünkü else kelime anlamı gibi "değilse" anlamına geliyor ve "değilse eğer" gibi bir anlam katıyor, baştaki if bloğu geçerli olduğu için yani if true sorgu ürettiği için diğer sorguları yapmadan geçiyor yani o satırları atlıyor. Direkt olarak if'e çevirmek gerekli. (İlle karar yapısı yapmak istiyorsan yoksa bunu kullanmadan da direkt olarak yapabiliriz.)

İkinci olarak senin değişkenlere atfetmiş olduğun yapı olan "%[^\n] " yapısı;

C'deki %[^\n] ifadesi genellikle tüm satırı okumak için kullanılır.
Diyelim ki scanf(“%[^\n]”, x);
Böylece yukarıdaki talimat, dosyanın (EOF) veya \n(sonraki satır) sonuna ulaşana kadar tüm karakterleri okuyacak ve x'e koyacaktır ama buna gerek var mı sence? Bence hayır onları da string ifadenin türünü belirten "s" ile değiştirdim.

En alta geldiğimizde sen printf ile ad soyadı yazdırmak isterken "%c" kullanmak istemişsin, c harfi char türünü sembolize eder char ise karakterleri yani 'A' bir chardir "A" ifadesi ise bir string değerdir, char tek bir değer alırken string değeri birden fazla karakter alabilir "aa" gibi bu yüzden %c yerine %s kullanmamız gerekli aksi halde %c ekrana veri yazdırmayacaktır.


Tüm bunlardan bağımsız aslında şu şekilde çalıştırabilirsin clean code mantığı burda devreye giriyor.

C:
#include <stdio.h>

int main() {
 
    char ad[15];
    char soyad[15];
 

    printf("Adinizi giriniz: ");
    scanf("%s",ad);
    printf("Soyadinizi giriniz: ");
    scanf("%s",soyad);
    printf("\n\nAdiniz ve soyadiniz kaydedildi.\nAdiniz Soyadiniz: ");
    printf("%s %s",ad,soyad);
  
    return 0;
}
 
Son düzenleme:

Yeni konular

Geri
Yukarı